Autor Tema: Ejercicio CU00641B curso java ejemplo relacion entre clases y pertenencia  (Leído 7217 veces)

Fco. Gómez

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 11
    • Ver Perfil
Buenas, tras unos días ausente por motivos laborales, retomamos los temas.
A ver si ahora se me tranquilizan las tareas.....
Pongo la solución a mi ejercicio a ver que os parece.
Clase Casa
Código: [Seleccionar]
/* Ejemplo - aprendeaprogramar.com */
//Esta clase representa datos de éste objeto Casa y de otros relacionados.
public class Casa { // El nombre de la Clase
    // comenzamos por las propiedades, atributos o campos de la clase
    private double superficie ;
    private String direccion;
    private SalonCasa salonKasa ; // pongo K para distinguirlo mejor ( con K son los de ésta clase )
    private CocinaCasa cocinaKasa; // pongo K para distinguirlo mejor ( con K son los de ésta clase )
   
    //Constructor: cuando se cree un objeto taxi se ejecutará el código que incluyamos en el constructor
    public Casa() {
        superficie = 0      ;
        direccion = "Desconocido";
        salonKasa = new SalonCasa () ; // pongo K para distinguirlo mejor ( con K son los de ésta clase )
        cocinaKasa = new CocinaCasa (); // pongo K para distinguirlo mejor ( con K son los de ésta clase )r
    } //Cierre del constructor … el código continúa …

    // SETTERS
    public void setSuperficie (double valorSuperficie) {  superficie = valorSuperficie;  } //Cierre del método
    public void setDireccion (String valorDireccion) {  direccion = valorDireccion ;  } //Cierre del método
   
    public void setCasaNumTv(int SCasaNumTv) { salonKasa.setNumeroTelevisores(SCasaNumTv) ;}
    public void setCasaTipoSalon(String SCasaTipoSalon) { salonKasa.setTipoSalon(SCasaTipoSalon) ;}
   
    public void setCasaEsIndependiente( boolean SCasaEsIndependiente ) { cocinaKasa.setEsIndependiente(SCasaEsIndependiente);}
    public void setCasaNumDeFuegos( int SCasaNumDeFuegos ) { cocinaKasa.setNumeroDeFuegos(SCasaNumDeFuegos);}
   
    //GETTERS
    public double getSuperficie () { return superficie; } //Cierre del método
    public String getDireccion () { return direccion; } //Cierre del método
    public String getDatosTodaLaCasa () {
        int KasaNumTV = salonKasa.getNumeroTelevisores() ;
        String KasaTipoSalon = salonKasa.getTipoSalon() ;
        boolean KasaEsIndependiente = cocinaKasa.getEsIndependiente();
        int KasaNumeroDeFuegos = cocinaKasa.getNumeroDeFuegos();
       
        String datosDeLaKasa = "Los datos de la casa son : Superficie "+ superficie + " Dirección : " + direccion +
        " Numero de Televisores : " + KasaNumTV + " Tipo de Salon : " + KasaTipoSalon +
        " Cocina Independiente : " +KasaEsIndependiente + " Numero de Fuegos : " + KasaNumeroDeFuegos ;
       
        System.out.println( datosDeLaKasa) ;
        return datosDeLaKasa ;
       
    } //Cierre del método
   
} // cierre de la clase

Ahora la clase CocinaCasa :
Código: [Seleccionar]
public class CocinaCasa { // El nombre de la Clase
    // comenzamos por las propiedades, atributos o campos de la clase
    private boolean esIndependiente;
    private int numeroDeFuegos;
   
    //Constructor:
    public CocinaCasa() {
        esIndependiente = false ;
        numeroDeFuegos = 0;
    } //Cierre del constructor … el código continúa …

    //Método para ESTABLECER el numeroTelevisores
    public void setEsIndependiente (boolean valorEsIndependiente) {
        esIndependiente = valorEsIndependiente; // el número de televisores
    } //Cierre del método
    //Método para establecer el tipo de salon
    public void setNumeroDeFuegos (int valorNumeroDeFuegos) {
        numeroDeFuegos = valorNumeroDeFuegos; //El tipo de salon
    } //Cierre del método

    //Método para OBTENER el numero de televisores
    public boolean getEsIndependiente () { return esIndependiente; } //Cierre del método
    //Método para obtener el tipo de salon
    public int getNumeroDeFuegos () { return numeroDeFuegos; } //Cierre del método
   
} // cierre de la clase

Y por último la clase SalonCasa :
Código: [Seleccionar]
public class SalonCasa { // El nombre de la Clase
    // comenzamos por las propiedades, atributos o campos de la clase
    private int numeroTelevisores;
    private String tipoSalon;
   
    //Constructor:
    public SalonCasa() {
        numeroTelevisores = 0      ;
        tipoSalon = "Desconocido";
    } //Cierre del constructor … el código continúa …

    //Método para ESTABLECER el numeroTelevisores
    public void setNumeroTelevisores (int valorNumeroTelevisores) {
        numeroTelevisores = valorNumeroTelevisores; // el número de televisores
    } //Cierre del método
    //Método para establecer el tipo de salon
    public void setTipoSalon (String valorTipoSalon) {
        tipoSalon = valorTipoSalon; //El tipo de salon
    } //Cierre del método

    //Método para OBTENER el numero de televisores
    public int getNumeroTelevisores () { return numeroTelevisores; } //Cierre del método
    //Método para obtener el tipo de salon
    public String getTipoSalon () { return tipoSalon; } //Cierre del método
   
} // cierre de la clase

Ha compilado sin errores ( al final, y despues de corregir unos cuantos, claro)
He probado y todo me ha funcionado.

Reflexión que me hago :
Un poco liosa al menos de momento, lo de la nomenclatura.
Supongo que habrá un modo mejor que el que he usado yo para organizar o dar los nombres a las clases, objetos, etc y que no se convierta en un galimatías el código.
O tal vez yo me estoy liando solo ?
Supongo que será por los dias que he estado "desconectado".
Un saludo y gracias.
« Última modificación: 30 de Enero 2015, 08:46 por Alex Rodríguez »

toni_apr

  • Avanzado
  • ****
  • Mensajes: 497
  • Curiosidad, es uno de los pilares del Conocimiento
    • Ver Perfil
Re:Ejercicio CU00641B
« Respuesta #1 en: 27 de Enero 2015, 23:49 »
Hola Fco. Gómez

Este ejercicio tiene bastante trabajo. Tus clases SalonCasa y CocinaCasa están bien, con su constructor y sus setters y getters. Bien.


Ahora bien, en la clase Casa hay métodos que están bien, los setters y getters de los atributos superficie y direccion.

Y otros que no deberían estar, son los métodos:
setCasaNumTv, setCasaTipoSalon, setCasaEsIndependiente, setCasaNumDeFuegos y getDatosTodaLaCasa.

Los cuatro primeros manipulan atributos de las clases SalonCasa y CocinaCasa y el último getDatosTodaLaCasa no se pedía en el enunciado del ejercicio, aunque es una buena idea mostrar información de toda la casa.

Los atributos que has nombrado salonKasa y cocinaKasa necesitan como los otros atributos sus setters y sus getters.

El getter del atributo salonKasa, sería así:
public SalonCasa getSalonKasa() { return salonKasa; }

Y el setter sería:
public void setSalonKasa (SalonCasa valorSalon) {
    salonKasa = valorSalon;
}

Te propongo que reformes la clase Casa para que tenga todos los métodos necesarios.

Para probar estas clases sigue las indicaciones que se muestran en esta lección junto a la imagen mostrada.


Saludos

MrClassic

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 37
    • Ver Perfil
Re:Ejercicio CU00641B
« Respuesta #2 en: 28 de Enero 2015, 03:20 »
Hola Fco. Gómez

Veo que implementaste tu solución, muy parecidad a la mia. creo que aveces no se entiende claramente lo que se pide y esto tiende a que incurramos en errores y en la realizacion de trabajo innecesario.

no me quedo claro si debemos imprimir o no la información.
segun leo en tu corrección creo que no.

¿Que crees tu?
Quedo en espera de sus recomendaciones y/o correcciones.

Gracias.

Fco. Gómez

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 11
    • Ver Perfil
Re:Ejercicio CU00641B
« Respuesta #3 en: 28 de Enero 2015, 15:55 »
Buenas de nuevo:
Al hilo de lo que me has indicado ...

Y otros que no deberían estar, son los métodos:
setCasaNumTv, setCasaTipoSalon, setCasaEsIndependiente, setCasaNumDeFuegos y getDatosTodaLaCasa.

Los cuatro primeros manipulan atributos de las clases SalonCasa y CocinaCasa y el último getDatosTodaLaCasa no se pedía en el enunciado del ejercicio, aunque es una buena idea mostrar información de toda la casa.

Correcto, en el enunciado no se pedia ( por lo tanto y de forma estricta, sobra)
La pregunta que me hago es... ( quizá me estoy adelantando en el tiempo...)
¿son correctos?
¿Se haría de ese modo para manipular los métodos de las clases a las que se refieren ?

El hecho de haberlo planteado así, es porque pensé que al crear un nuevo objeto Casa debería poder "introducir valores" para sustituir a los que definimos por defecto.
Mi temor es que esté adelantando acontecimientos, pero como voy haciendo los ejercicios y guardando toda la documentación que puedo, para mi es aclaratorio.
Tanto plantearlo y preguntar como saber si estoy en la senda correcta y entender mejor como se hacen las cosas y se harán en el futuro.

Por otro lado, lo de imprimir, me pareció bien (aunque no se pedía, por lo que pido disculpas) para visualizar el resultado del proceso.
Es pura deformación.

Continúo :
Citar
Los atributos que has nombrado salonKasa y cocinaKasa necesitan como los otros atributos sus setters y sus getters.

El getter del atributo salonKasa, sería así:
public SalonCasa getSalonKasa() { return salonKasa; }

Y el setter sería:
public void setSalonKasa (SalonCasa valorSalon) {
    salonKasa = valorSalon;
}

Te propongo que reformes la clase Casa para que tenga todos los métodos necesarios.

Para probar estas clases sigue las indicaciones que se muestran en esta lección junto a la imagen mostrada.


Entiendo, todos los atributos que se definan, han de tener su setter y getter correspondiente.
Mea culpa, soy un poco desastre, se me pasó por completo.

Pero mi pregunta ahora es :
Con el método set y get de estos atributos,
¿que es lo que estamos haciendo realmente?
Asignamos y recuperamos los valores de los atributos de las clases a las que se refieren.
O simplemente :
en el get recuperamos los valores por defecto que tienen al crear el nuevo objeto SalonCasa
Y en el set? Qué hace ese set exactamente ???
Todavía no acabo de verlo.
Igual es que estoy un poco espeso o quizá quiera ir mas rápido de lo que debo a éstas alturas.
Espero con impaciencia las aclaraciones.
Muchas gracias y perdón por el rollo.

P.D.:
Acabo de ver otro error en el código ( por omisión) en la clase Casa
Lo corrijo y pondré el código en cuanto lo tenga.
Pido disculpas por mi olvido.
Un saludo.
« Última modificación: 28 de Enero 2015, 16:48 por Fco. Gómez »

Fco. Gómez

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 11
    • Ver Perfil
Re:Ejercicio CU00641B
« Respuesta #4 en: 28 de Enero 2015, 16:44 »
Hola MrClassic:


no me quedo claro si debemos imprimir o no la información.
segun leo en tu corrección creo que no.

¿Que crees tu?

Pues realmente no se pedía, así que no deberíamos pintarla. Si bien es cierto que la información no está de mas.
A mi me hace mas "llevadera la solución" al ver el resultado pintado en pantalla.
En otros trabajos que he hecho con otros lenguajes, he usado y quizá abusado de pintar los datos relevantes por pantalla para ver como iban quedando las cosas.
En plan debugger cutre y salchichero, para dejar el código comentado una vez que se ponian en marcha el programa en cuestión.
Para mi es como una especia de autoapoyo, pero sí, no lo habian pedido.
Y lo que es peor...
No he hecho ( con las prisas) cosas que sí habian pedido y que espero corregir entre hoy y mañana.
Antes de que me tiren virtualmente de las orejas.
Un saludo.

Fco. Gómez

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 11
    • Ver Perfil
Re:Ejercicio CU00641B
« Respuesta #5 en: 28 de Enero 2015, 17:32 »
Buenas de nuevo:
Volviendo al ejercicio que me quedó incompleto.
Faltaba el segundo constructor, el que le debemos pasar los parámetros.
Será que estoy un poco espeso hoy porque no me compila y no consigo saber que estoy haciendo mal.

Adjunto el codigo:
Código: [Seleccionar]
   
// constructor 2
    public Casa( double superficie, String direccion, SalonCasa objetoSalonCasa, CocinaCasa objetoCocinaCasa) {
        superficie = getSuperficie() ;
        direccion = getDireccion() ;
        // creamos un objeto salonKasa con los mismos datos de la clase SalonCasa recibidos como parámetros
//---------aquí da el error : 
// constuctor SalonCasa in class SalonCasa cannot be applied to given types;
// required : no arguments
// found:int.java.lang.String
// reason: actual and formal argument lists differ in length
// the operator that you use here cannot be used for the type of value that you are
//using it for. You are either using the wrong type here or the wrong operator.
        salonKasa = new SalonCasa(objetoSalonCasa.getNumeroTelevisores(), objetoSalonCasa.getTipoSalon() );
        cocinaKasa = new CocinaCasa(objetoCocinaCasa.getEsIndependiente(), objetoCocinaCasa.getNumeroDeFuegos() );
    }

Casi lo dejo para mañana porque hoy, ... mejor ir a descansar un rato.
Saludos y gracias.

toni_apr

  • Avanzado
  • ****
  • Mensajes: 497
  • Curiosidad, es uno de los pilares del Conocimiento
    • Ver Perfil
Re:Ejercicio CU00641B
« Respuesta #6 en: 28 de Enero 2015, 22:06 »
Hola Fco.

Tal como tu dices, tal vez te estás adelantando.
Pero no te preocupes, está bien que intentes ver más allá.

Respecto a mostrar la información te confirmo que si, que está bien hacerlo, pero resulta que para dar la información correctamente debes tener bien el resto del código.
Me refiero a todos los setters y getters de la clase.

Si tienes estos métodos bien, y quieres mostrar la información de las clases, adelante. Seguramente al partir de una base sólida tu método para mostrar información estará perfecto.
Pero, si tienes paciencia, veras más adelante un método elegante que usa Java para mostrar información sobre la clase.
Citar
Pero mi pregunta ahora es :
Con el método set y get de estos atributos,
¿que es lo que estamos haciendo realmente?

Respondo a la cita anterior.
Cuando creas un objeto en BlueJ, con el método set modificas el contenido del atributo y así tendrás un valor distinto del que tu constructor le puso por defecto, ya fuera una cadena vacía, un cero o un false.

Y con el get compruebas que el atributo tiene el valor que tu deseas, y si no lo modificas con el set.

Resumiendo Fco.
Te propongo que en los ejercicios resuelvas, crees el código o respondas a lo que se pide en el ejercicio siguiendo su enunciado.
Luego, cuando te funcione lo básico del ejercicio, puedes hacer tus aportaciones que no desmereceran el ejercicio. Pero primero, repito, lo primero.

A continuación te pongo  un enlace a una respuesta dada para este mismo ejercicio a MrClassic (otro usuario del foro) con el propósito de que pueda servirte.

https://www.aprenderaprogramar.com/foros/index.php?topic=1884.msg9563#msg9563

Ah, en este ejercicio no se pide segundo constructor.

Saludos

Fco. Gómez

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 11
    • Ver Perfil
Re:Ejercicio CU00641B
« Respuesta #7 en: 30 de Enero 2015, 09:12 »
Buenas de nuevo:
A riesgo de ser pesado, creo que necesito aclararme mas en detalle, si es posible.
Sí, el metodo set es el que modifica el valor del atributo correspondiente.
Eso está claro. ya lo hemos visto y no me plantea dudas.
Pero cuando hacemos un método set de un objeto, como es el caso, y en ese objeto (dentro) tenemos mas de un atributo, ...
¿qué atributo modifica el método set ?
El primero ? todos los que tenga el objeto al que hace referencia ?
 ???
Eso es lo que no acabo de entender.

Por otro lado al hilo del segundo constructor, en el ejercicio decía :
Citar
Define un constructor para la clase Casa que establezca a unos valores de defecto los atributos simples y que cree nuevos objetos si se trata de atributos objeto.

Define otro constructor que reciba como parámetros la superficie, dirección y un objeto de tipo SalonCasa y otro de tipo CocinaCasa.

En mi primera propuesta de solución solo había definido el primer constructor.
Luego me di cuenta que me habia saltado el segundo que se pedía, el que lleva los parámetros.
Y que es el que me da error al compilar.
Y ahí estoy atascado.
Adjunto el código...
Código: [Seleccionar]
/* Ejemplo - aprendeaprogramar.com */
//Esta clase representa datos de éste objeto Casa y de otros relacionados.
public class Casa { // El nombre de la Clase
    // comenzamos por las propiedades, atributos o campos de la clase
    private double superficie ;
    private String direccion;
    private SalonCasa salonKasa ; // pongo K para distinguirlo mejor ( con K son los de ésta clase )
    private CocinaCasa cocinaKasa; // pongo K para distinguirlo mejor ( con K son los de ésta clase )
   
    //Constructor: cuando se cree un objeto taxi se ejecutará el código que incluyamos en el constructor
    public Casa() {
        superficie = 0      ;
        direccion = "Desconocido";
        salonKasa = new SalonCasa () ; // pongo K para distinguirlo mejor ( con K son los de ésta clase )
        cocinaKasa = new CocinaCasa (); // pongo K para distinguirlo mejor ( con K son los de ésta clase )r
    } //Cierre del constructor … el código continúa …

    // constructor 2
    public Casa( double superficie, String direccion, SalonCasa objetoSalonCasa, CocinaCasa objetoCocinaCasa) {
        superficie = getSuperficie() ;
        direccion = getDireccion() ;
        // creamos un objeto salonKasa con los mismos datos de la clase SalonCasa recibidos como parámetros
        salonKasa = new SalonCasa(objetoSalonCasa.getNumeroTelevisores(), objetoSalonCasa.getTipoSalon() );
        cocinaKasa = new CocinaCasa(objetoCocinaCasa.getEsIndependiente(), objetoCocinaCasa.getNumeroDeFuegos() );
    }
   
    // SETTERS
    public void setSuperficie (double valorSuperficie) {  superficie = valorSuperficie;  } //Cierre del método
    public void setDireccion (String valorDireccion) {  direccion = valorDireccion ;  } //Cierre del método
    public void setSalonKasa (SalonCasa valorSalon) {   salonKasa = valorSalon; }   // hay que definir el set correspondiente al atributo
    public void setCocinaKasa (CocinaCasa valorCocina) {   cocinaKasa = valorCocina; }  // hay que definir el set correspondiente al atributo
   
    //////// éstos no están correctos en este momento y ejercicio
    // public void setCasaNumTv(int SCasaNumTv) { salonKasa.setNumeroTelevisores(SCasaNumTv) ;}
    // public void setCasaTipoSalon(String SCasaTipoSalon) { salonKasa.setTipoSalon(SCasaTipoSalon) ;}
    // public void setCasaEsIndependiente( boolean SCasaEsIndependiente ) { cocinaKasa.setEsIndependiente(SCasaEsIndependiente);}
    // public void setCasaNumDeFuegos( int SCasaNumDeFuegos ) { cocinaKasa.setNumeroDeFuegos(SCasaNumDeFuegos);}
   
    //GETTERS
    public double getSuperficie () { return superficie; } //Cierre del método
    public String getDireccion () { return direccion; } //Cierre del método
    public SalonCasa getSalonKasa() { return salonKasa; }  // hay que definir el get correspondiente al atributo
    public CocinaCasa getCocinaKasa() { return cocinaKasa; } // hay que definir el get correspondiente al atributo
   
    public String getDatosTodaLaCasa () {
        int KasaNumTV = salonKasa.getNumeroTelevisores() ;
        String KasaTipoSalon = salonKasa.getTipoSalon() ;
        boolean KasaEsIndependiente = cocinaKasa.getEsIndependiente();
        int KasaNumeroDeFuegos = cocinaKasa.getNumeroDeFuegos();
       
        String datosDeLaKasa = "Los datos de la casa son : Superficie "+ superficie + " Dirección : " + direccion +
        " Numero de Televisores : " + KasaNumTV + " Tipo de Salon : " + KasaTipoSalon +
        " Cocina Independiente : " +KasaEsIndependiente + " Numero de Fuegos : " + KasaNumeroDeFuegos ;
       
        System.out.println( datosDeLaKasa) ;
        return datosDeLaKasa ;
       
    } //Cierre del método
   
} // cierre de la clase

Me ceñiré fielmente de ahora en adelante a lo que se proponga el ejercicio para no liarla.

Pero si no es molestia, os haré preguntas aclaratorias, para tener las bases mas sólidas de cara a poder avanzar con seguridad en las distintas fases del curso.
No es mi intención ser un pesado y os pido disculpas por adelantado.

En una ocasión un profesor que tuve repetía con cierta frecuencia:
"no hay pregunta tonta, solo tontos que no preguntan"



toni_apr

  • Avanzado
  • ****
  • Mensajes: 497
  • Curiosidad, es uno de los pilares del Conocimiento
    • Ver Perfil
Hola Fco.

Creo entender lo que quieres decir.

En un atributo primitivo, un int por ejemplo, su método set cambia todo el atributo. Ejem
superficie = 12;
setSuperficie(15);

Parece que hemos cambiado el 2 por un 5, pero en realidad hemos cambiado el doce por un quince. Hemos sustituido lo que había por un valor nuevo.

En un atributo de tipo objeto ya sea de tipo SalonCasa o CocinaCasa su método set cambia también todo el contenido del objeto no solo uno, o la mitad de los atributos que contiene ese objeto.
Ejem. Cuando a un conductor le asignan un vehículo distinto en la empresa de transportes, le asignan un vehículo entero, no una rueda o un retrovisor. El cambio afecta al vehículo entero.

Espero que estas sutilezas las puedas corroborar conforme avanze el curso.


En cuanto a la duda del segundo constructor. Quiero que compruebes que estamos hablando de la entrega CU00641B que no pide un segundo constructor. Esa petición se hace en la siguiente entrega.

Aprovecho para despejar tu duda.
Este segundo constructor te da error porque intentas crear un objeto de tipo SalonCasa usando un constructor de dos parámetros cuando en la clase SalonCasa solo existe un constructor sin parámetros.
También sucede lo mismo con el objeto cocinaKasa

        salonKasa = new SalonCasa(objetoSalonCasa.getNumeroTelevisores(), objetoSalonCasa.getTipoSalon() );
        cocinaKasa = new CocinaCasa(objetoCocinaCasa.getEsIndependiente(), objetoCocinaCasa.getNumeroDeFuegos() );

Y Fco. Sin ningún problema plantea tus consultas sin reparo, para eso estamos.

Saludos

Fco. Gómez

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 11
    • Ver Perfil
Re:Ejercicio CU00641B curso java ejemplo relacion entre clases y pertenencia
« Respuesta #9 en: 03 de Febrero 2015, 18:27 »
Muchas gracias Toni_apr

Me parece que tengo que hacer una pausa y releer todo hasta el momento antes de proseguir.
Comprendo lo que me has comentado y voy a recapitular.
Además durante unos días tendré que estar off-line y centrarme en la "avalancha de marrones" que tengo que solucionar.
Nos leemos tras el paréntesis forzoso.
Muchisimas gracias por la ayuda.


 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".