Autor Tema: Sobreescribir métodos toString y equals en Java (CU00694B) ejercicio resuelto  (Leído 4111 veces)

adrit

  • Principiante
  • **
  • APR2.COM
  • Mensajes: 59
    • Ver Perfil
Hola!

Dejo mi resolución para el ejercicio numero CU00694B

Citar
EJERCICIO

Define una clase Figura de la que hereden otras dos clases denominadas Cuadrado y Círculo. La clase figura debe tener al menos el campo dimensionPrincipal. Las clases Cuadrado y Círculo deben tener al menos un método calcularArea que permita calcular el área a partir de la dimensión principal, utilizando la fórmula matemática correspondiente. Además, sobreescribe el método equals para que dos cuadrados sean iguales si tienen igual dimensión principal, y dos círculos idem. A continuación crea un programa test donde crees varios círculos y cuadrados y hagas comprobaciones de igualdad usando el método equals.

Código: [Seleccionar]
public class Figura {
    private double dimensionPrincipal;

    public Figura () {}

    public Figura (double dimensionPrincipal) {
        this.dimensionPrincipal=dimensionPrincipal;
    }

    public void setDimensionPrincipal (double dimensionPrincipal) {
        this.dimensionPrincipal=dimensionPrincipal;
    }

    public double getDimensionPrincipal() { return dimensionPrincipal; }
   
    public String toString() {
        return ((Double)getDimensionPrincipal()).toString();
    }

    public boolean equals(Object Obj) {
        if (Obj instanceof Figura) {
            Figura tmpFigura = (Figura)Obj;
            if (((Double)this.dimensionPrincipal).equals(tmpFigura.dimensionPrincipal)) {
                return true;
            } return false;
        } return false;
    }
}

Código: [Seleccionar]
public class Circulo extends Figura {
    private static final double PI = 3.1416;
    public Circulo (double diametro) {    super(diametro);  }

    public double calcularArea() {    return PI*Math.pow((getDimensionPrincipal()/2),2);   }
   
    public double getDiametro() {return getDimensionPrincipal();}
   
    public String toString() {
        return "Diametro en cm : ".concat(super.toString());
    }

    public boolean equals (Object Obj) {
        if(Obj instanceof Circulo) {
            Circulo tmpCirculo=(Circulo)Obj;
            if(super.equals(tmpCirculo) && ((Double)this.calcularArea()).equals(tmpCirculo.calcularArea())) {
                return true;
            } return false;
        } return false;
    }
}

Código: [Seleccionar]
public class Cuadrado extends Figura {
    public Cuadrado (double dimensionPrincipal) {    super(dimensionPrincipal);    }
    public double calcularArea() {    return Math.pow(getDimensionPrincipal(),2);   }
    public double getLado() { return getDimensionPrincipal();}
    public String toString() {
        return "Lado en cm : ".concat(super.toString());
    }
    public boolean equals (Object Obj) {
        if (Obj instanceof Cuadrado) {
            Cuadrado tmpCuadrado = (Cuadrado)Obj;
            if(super.equals(tmpCuadrado) && ((Double)this.calcularArea()).equals(tmpCuadrado.calcularArea())) {
                return true;
            } return false;
        } return false;
    }
}

Código: [Seleccionar]
import java.util.List;
import java.util.ArrayList;

public class Test {
    public static void main(String[] args) {
        List<Figura> lista = new ArrayList<Figura>();
        Cuadrado cuadrado1 = new Cuadrado (10);
        Cuadrado cuadrado2 = new Cuadrado (12);
        Cuadrado cuadrado3 = new Cuadrado (10);
        Circulo circulo1 = new Circulo (10);
        Circulo circulo2 = new Circulo (10);
        Circulo circulo3 = new Circulo (12);
        lista.add(cuadrado1); lista.add(cuadrado2); lista.add(cuadrado3);
        lista.add(circulo1); lista.add(circulo2); lista.add(circulo3);
        System.out.println("Lista de figuras creadas:\n");
        int a = 1, b = 1;
        for(Figura tmp:lista){
            if(tmp instanceof Circulo){
                System.out.println("Circulo "+a+++" :");
                System.out.println(tmp.toString());
            } else {
                System.out.println("Cuadrado "+b+++" : ");
                System.out.println(tmp.toString());
            }
        }
        System.out.println("cuadrado 1 es igual a cuadrado 2? "+cuadrado1.equals(cuadrado2));
        System.out.println("cuadrado 1 es igual a cuadrado 3? "+cuadrado1.equals(cuadrado3));
        System.out.println("circulo 1 es igual a circulo 2? "+circulo1.equals(circulo2));
        System.out.println("circulo 1 es igual a circulo 3? "+circulo1.equals(circulo3));
    }
}

Gracias!!

RaGa

  • Moderador Global
  • Intermedio
  • *******
  • APR2.COM
  • Mensajes: 234
    • Ver Perfil
Hola Adrián:

Estuve revisando tu ejercicio y lo veo bien. De todos modos haría algunas observaciones para mejorarlo aún más.

Respecto de la clase Figura
:
Reescribo el código de dos de sus métodos para ir explicitando las sugerencias.

Código: [Seleccionar]
    @Override
    public String toString() {
        return ((Double)getDimensionPrincipal()).toString();
    }

    @Override
    public boolean equals(Object Obj) {
        if (Obj instanceof Figura) {
            Figura tmpFigura = (Figura)Obj;
            if (dimensionPrincipal==tmpFigura.dimensionPrincipal) {   
                return true;
            } return false;
        } return false;
    }
}

Fíjate que he incluido el tag @Override sobre las clases que sobreescribimos, que viene siendo muy útil para ir teniendo en cuenta los métodos que se van sobreescribiendo.
Otro detalle importante es -hablando del método sobreescrito equals- qué consideración imponemos para determinar que dos objetos Figura son iguales.
Como dos figuras serán iguales siempre que sus atributos dimensionPrincipal (tipo primitivo double) sean iguales, entonces esa comprobación habría que hacerla de la siguiente manera:

Código: [Seleccionar]
if (dimensionPrincipal == tmpFigura.dimensionPrincipal) {
Respecto de la clase Circulo
:
Solo un detalle menor en el método sobreescrito equlas(), reescribo el código.

Código: [Seleccionar]
    @Override
    public boolean equals (Object Obj) {
        if(Obj instanceof Circulo) {
            Circulo tmpCirculo=(Circulo)Obj;
            if(super.equals(tmpCirculo)) {
                return true;
            } return false;
        } return false;
    }

Fíjate que la única modificiación es sobre la línea del segundo if.
Ya que el valor del area varía en función del atributo dimensión principal unicamente, es redundante hacer ambas comprobaciones, ya que si las dimensiones principales son las mismas indefectiblemente lo serán sus áreas (y viceversa).

Respecto de la clase Cuadrado:
Misma observación que para la clase Círculo.

Analízalo y cualquier duda estamos aquí para reveerlo.

adrit

  • Principiante
  • **
  • APR2.COM
  • Mensajes: 59
    • Ver Perfil
Hola RaGa,

Gracias! y que buena observación, no me había dado cuenta de la doble comparación.
De hecho también podría no sobreescribir el método en las clases Circulo y Cuadrado.
Es decir, usar el método de la superclase directamente!

Esto es correcto?

RaGa

  • Moderador Global
  • Intermedio
  • *******
  • APR2.COM
  • Mensajes: 234
    • Ver Perfil
Hola Adrián:

No, el método equals() si debe ser sobreescritos tanto en la clase Circulo como en la clase Cuadrado ya que antes de comprobar que tienen el mismo valor del campo dimensionPrincipal, hay que verificar que estemos comparando el mismo tipo de subclase de Figura. De lo contrario nos daría 'true' si comparamos un objeto tipo Triangulo con el mismo valor de dimensionPrincipal que un objeto tipo Cuadrado.

Analízalo y si hay dudas lo seguimos analizando.

adrit

  • Principiante
  • **
  • APR2.COM
  • Mensajes: 59
    • Ver Perfil
Hola RaGa,

Tenes razon, no fue correcta mi sugerencia de no sobreescribir el metodo equals.

Gracias nuevamente.

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