Autor Tema: EJERCICIO CU00642B Java (Paso de objetos parámetros a un método o constructor)  (Leído 4175 veces)

Papipanchi

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 38
    • Ver Perfil
Hola a todos.

Como es habitual os envío el resultado del ejercicio CU00642 para su corrección.

Saludos.

Código: [Seleccionar]
//Ejercicio CU00642
public class CocinaCasa {

    public boolean esIndependiente;
    public int numeroDeFuegos;

    //Constructor 1
    public CocinaCasa (){
        esIndependiente=false;
        numeroDeFuegos=0;
    }
   
    //Constructor 2: recibiendo parametros
    public CocinaCasa (boolean esIndependiente, int numeroDeFuegos){
        esIndependiente=false;
        numeroDeFuegos=0;
    }

    public void setEsIndependiente (boolean valorEsIndependiente){
        esIndependiente=valorEsIndependiente;
    }

    public void setNumeroDeFuegos (int valorNumeroDeFuegos){
        numeroDeFuegos=valorNumeroDeFuegos;
    }

    public boolean getEsIndependiente ()
    {return esIndependiente;}

    public int getNumeroDeFuegos ()
    {return numeroDeFuegos;}
}

Código: [Seleccionar]
//Ejercicio CU00642
public class SalonCasa {

    public int numeroDeTelevisores;
    public String tipoSalon;

    //Constructor 1
        public SalonCasa () {
        numeroDeTelevisores=0;
        tipoSalon="Desconocido";
    }
   
    //Constructor 2: recibiendo parametros
    public SalonCasa (int numeroDeTelevisores, String tipoSalon){
        numeroDeTelevisores=0;
        tipoSalon="Desconocido";
    }
   
    public void setNumeroDeTelevisores (int valorNumeroDeTelevisores){
        numeroDeTelevisores=valorNumeroDeTelevisores;
    }
   
    public void setTipoSalon (String valorTipoSalon){
        tipoSalon=valorTipoSalon;
    }
   
    public int getNumeroDeTelevisores () {
        return numeroDeTelevisores;
    }
   
    public String getTipoSalon (){
        return tipoSalon;
    }
}

Código: [Seleccionar]
//Ejercicio CU00642
public class Casa{

    public double superficie;
    public String direccion;
    public SalonCasa salonCasa;
    public CocinaCasa cocina;

    //Constructor 1
    public Casa (){
        superficie=0.00;
        direccion="Desconocida";
        salonCasa= new SalonCasa ();
        cocina=new CocinaCasa ();
    }

    //Constructor 2: recibe parametros
    public Casa(double superficie, String direccion, SalonCasa objetoSalonCasa, CocinaCasa objetoCocinaCasa){
        superficie=0.00;
        direccion="desconocida";
        salonCasa = new SalonCasa (objetoSalonCasa.getNumeroDeTelevisores(), objetoSalonCasa.getTipoSalon());
        cocina = new CocinaCasa (objetoCocinaCasa.getEsIndependiente(), objetoCocinaCasa.getNumeroDeFuegos());
    }

    public void setSuperficie (double valorSuperficie){
        superficie=valorSuperficie;
    }

    public void setDirección (String valorDireccion) {
        direccion=valorDireccion;
    }

    public void setNumeroDeTelevisores (int valorNumeroDeTelevisores){
        salonCasa.setNumeroDeTelevisores (valorNumeroDeTelevisores);     
    }

    public void setTipoSalon (String valorTipoSalon){
        salonCasa.setTipoSalon (valorTipoSalon);
    }
   
    public void setEsIndependiente (boolean valorEsIndependiente) {
        cocina.setEsIndependiente (valorEsIndependiente);
    }
   
    public void setNumeroDeFuegos (int valorNumeroDeFuegos) {
        cocina.setNumeroDeFuegos (valorNumeroDeFuegos);
    }
   
    public String getDatosCasa () {
        double superficie=0.00;
        String direccion="desconocida";
        int numeroDeTelevisores=salonCasa.getNumeroDeTelevisores ();
        String tipoSalon=salonCasa.getTipoSalon ();
        boolean esIndependiente=cocina.getEsIndependiente ();
        int numeroDeFuegos=cocina.getNumeroDeFuegos ();
       
        String datosCasa = "El objeto Casa presenta estos datos. Superficie: " + superficie + " Dirección: " + direccion + " Numero de televisores: " + numeroDeTelevisores + "¿Es la cocina independiente?: " + esIndependiente + " Numero de fuegos: " + numeroDeFuegos;
       
        System.out.println (datosCasa);
        return datosCasa;
    }   
}
« Última modificación: 24 de Diciembre 2014, 08:36 por Ogramar »

Mastermind

  • Experto
  • *****
  • Mensajes: 536
    • Ver Perfil
Saludos papichanchi, la revisión del código que he hecho:

En la clase CocinaCasa, el constructor que recibe dos parámetros no está bien planteado:

    public CocinaCasa (boolean esIndependiente, int numeroDeFuegos){
        esIndependiente=false;
        numeroDeFuegos=0;
    }

Un constructor sirve para crear un objeto, y si recibe parámetros será para crear el objeto a partir de dicha información. Si recibes la información pero no la usas, ¿para qué quieres la información?

En la clase SalonCasa ocurre lo mismo con el constructor que recibe dos parámetros.



En la clase Casa el constructor sin parámetros está bien.

Pero el constructor con parámetros tiene problemas:

si recibes la superficie como parámetro pero después escribes superficie=0.00; ¿Para qué te sirve la superficie recibida como parámetro?

Lo mismo con la direccion.

En cambio salonCasa y cocina sí están bien planteados dentro del constructor.


En la clase Casa hay métodos que no deben estar ahí:

setNumeroDeTelevisores no debe estar ahí ¿Por qué? Porque el número de televisores es un atributo de la clase SalonCasa, y no debe manipularse desde la clase Casa.

Lo mismo para otros métodos que no son atributos directos de Casa.

Finalmente te faltan los métodos setSalonCasa y setCocina. De la misma forma que tienes un método setSuperficie que es para un tipo primitivo, debes tener un método para los demás atributos aunque sean objetos.

Revisa estos hilos seguramente te den ideas útiles!!:

https://www.aprenderaprogramar.com/foros/index.php?topic=1220.0

https://www.aprenderaprogramar.com/foros/index.php?topic=1238

Papipanchi

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 38
    • Ver Perfil
Muchas gracias por responder a mi solicitud, he estado una temporada sin realizar el curso por eso mi tardanza.

Adjunto de nuevo el código de la clase casa rectificado a ver si así estuviera correcto.

Como podrás observar los métodos getter de SalonCasa y CocinaCasa son diferentes y los he realizado así a propósito para ver que diferencia hay entre uno y otro. Al ejecutar los métodos veo que el de SalonCasa me devuelve los datos por defecto del constructor y el de CocinaCasa devuelve los datos que he ido introduciendo en el método setter. No se tienes algo que comentar al respecto.

Por otro lado comentarte cosas que he visto en los enlaces que me indicaste. Por un lado había cosas que me han servido pero había otras que me hacían que me liara todavía mas de lo que estaba, siento también dicho motivo el origen de mi retraso en la respuesta.

Hasta la fecha en lo que llevo realizado de curso para realizar los métodos siempre se han utilizado los nombres de los atributos o en este caso los de los objetos. ¿Como puede ser que en la clase casa uno de los objetos se denomine salonCasa y al utilizarlos en los métodos los nombra como salón? ¿no hay que utilizar el nombre del objeto o del atributo en su caso?

A ver si me resuelves la duda porque sobre todo me lío con la denominación del código.

Otra cosa que tampoco entiendo es porque se pone "objetoSalonCasa" ¿Es un nombre aleatorio o para que entienda que se refiere a un objeto hay que ponerlo así. Si le quito la palabra objeto y dejo solo salonCasa, como se llama realmente el objeto, no funciona.

En fin, a ver si me aclaras las dudas


Código: [Seleccionar]
//Ejercicio 642
public class Casa{ //Nombre de la clase

    public double superficie;
    public String direccion;
    public SalonCasa salonCasa;
    public CocinaCasa cocina;

    //Constructor 1: sin parametros
    public Casa (){
        superficie=0.00;
        direccion="Desconocida";
        salonCasa=new SalonCasa();//Creamos un objeto SalonCasa con el constructor general de SalonCasa
        cocina=new CocinaCasa();//Creamos un objeto CocinaCasa con el constructor general de CocinaCasa
    }

    //Constructor 2: Con parametros
    public Casa (double valorSuperficie, String valorDireccion, SalonCasa objetoSalonCasa, CocinaCasa objetoCocinaCasa){
        superficie=valorSuperficie;
        direccion=valorDireccion;
        //Creamos un objeto SalonCasa con los mismos datos del objeto SalonCasa recibido como parametro
        salonCasa=new SalonCasa (objetoSalonCasa.getNumeroDeTelevisores(), objetoSalonCasa.getTipoSalon());
        //Creamos un objeto CocinaCasa con los mismos datos del objeto CocinaCasa recibido como parametro
        cocina=new CocinaCasa (objetoCocinaCasa.getEsIndependiente(), objetoCocinaCasa.getNumeroDeFuegos());
    }

    //Metodo para establecer la superficie de un objeto Casa
    public void setSuperficie (double valorSuperficie){
        superficie=valorSuperficie;
    }
    //Metodo para establecer la Direccion de un objeto Casa
    public void setDireccion (String valorDireccion){
        direccion=valorDireccion;
    }

    //Metodo para establer salonCasa
    public void setSalonCasa (SalonCasa objetoSalonCasa){
        salonCasa=new SalonCasa(objetoSalonCasa.getNumeroDeTelevisores(), objetoSalonCasa.getTipoSalon());
    }

    //Metodo para establecer cocina
    public void setCocina (CocinaCasa valorCocina){
        cocina=new CocinaCasa();
        cocina.setEsIndependiente(valorCocina.getEsIndependiente());
        cocina.setNumeroDeFuegos(valorCocina.getNumeroDeFuegos());
    }

    //Metodo para obtener la superficie de un objeto Casa
    public double superficie () {return superficie;}
    //Metodo para obtener la dierección de un objeto Casa
    public String dirección () {return direccion;}

    //Metodo para obtener el salonCasa de un objeto Casa
    public SalonCasa getSalonCasa (){
        salonCasa=new SalonCasa();
        salonCasa.getNumeroDeTelevisores();
        salonCasa.getTipoSalon();
        return salonCasa;
    }
   
    //Metodo para obtener la cocina de un objeto Casa
    public CocinaCasa getCocina (){
        cocina=new CocinaCasa(cocina.getEsIndependiente(), cocina.getNumeroDeFuegos());
    return cocina;
}
           

    //Metodo para obtener la información sobre el objeto Casa
    public String getDatosCasa(){
        int numeroDeTelevisores=salonCasa.getNumeroDeTelevisores();
        String tipoSalon=salonCasa.getTipoSalon();
        boolean esIndependiente=cocina.getEsIndependiente();
        int numeroDeFuegos=cocina.getNumeroDeFuegos();

        String datosCasa= "El objeto Casa presenta estos datos. Superficie: " + superficie + " Dirección: " + direccion + " Número de televisores: " + numeroDeTelevisores + " Tipo de salon: " + tipoSalon + " ¿es independiente?: " + esIndependiente + " numero de fuegos: " + numeroDeFuegos;

        System.out.println (datosCasa);
        return datosCasa;
    }//Cierre del metodo

}//Cierre de la clase



Mastermind

  • Experto
  • *****
  • Mensajes: 536
    • Ver Perfil
Hola, esto es incorrecto:

Código: [Seleccionar]
    public SalonCasa getSalonCasa (){
        salonCasa=new SalonCasa();
        salonCasa.getNumeroDeTelevisores();
        salonCasa.getTipoSalon();
        return salonCasa;
    }

Aquí estás redefiniendo el atributo salonCasa (con new) como si se creara un nuevo objeto, en lugar de simplemente devolver el atributo de la clase, que es lo que tiene que hacer un get.

Este método debe ser simplemente:
 
Código: [Seleccionar]
  public SalonCasa getSalonCasa (){
        return salonCasa;
    }


Este método también es incorrecto:
 
Código: [Seleccionar]
   //Metodo para obtener la cocina de un objeto Casa
    public CocinaCasa getCocina (){
        cocina=new CocinaCasa(cocina.getEsIndependiente(), cocina.getNumeroDeFuegos());
    return cocina;
}


Aquí estás creando redefiniendo el puntero cocina (manteniendo la misma información que tenía el objeto cocina antiguo), cuando simplemente un get debe devolver el puntero sin más complicaciones:
Código: [Seleccionar]
   //Metodo para obtener la cocina de un objeto Casa
    public CocinaCasa getCocina (){  return cocina; }


Redefinir es una complicación innecesaria. Ten en cuenta que un get con objetos funciona de forma igual (o casi igual) que si fuera para un tipo primitivo como int.

 ¿Como puede ser que en la clase casa uno de los objetos se denomine salonCasa y al utilizarlos en los métodos los nombra como salón? -- > Si nos referimos al atributo debemos usar el nombre del atributo, si nos referimos a un parámetro debemos usar el nombre del parámetro, si nos referimos a una variable local podemos usar el nombre que queramos.

Otra cosa que tampoco entiendo es porque se pone "objetoSalonCasa" ¿Es un nombre aleatorio o para que entienda que se refiere a un objeto hay que ponerlo así. -- > Es un nombre aleatorio. Para que todo funcione, hay que comprobar la coherencia de los nombres.

Saludos!!

 

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".