Mi versión del Ejercicio propuesto en la Entrega Nº94. Ejercicio CU00694B.
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.
Clase Figura
/**
* Clase Figura
*
* @author (RaGa)
* @version (20150428)
*/
public class Figura{
// Declaración de campos de instancia.
protected double dimensionPrincipal;
/**
* Constructor de clase
*/
public Figura(double dimensionPrincipal){
this.dimensionPrincipal=dimensionPrincipal;
}
/**
* setters
*/
public void setDimensionPrincipal(double dimensionPrincipal){
this.dimensionPrincipal=dimensionPrincipal;
}
/**
* getters
*/
public double getDimensionPrincipal(){
return dimensionPrincipal;
}
/**
* método equals
*/
public boolean equals(Object obj){
if(obj instanceof Figura){
Figura tmp=(Figura)obj;
if(this.dimensionPrincipal==tmp.dimensionPrincipal){
return true;
}
else{return false;}
}
else{return false;}
}
} // fin de la clase
Clase Cuadrado
/**
* Clase Cuadrado
*
* @author (RaGa)
* @version (20150428)
*/
public class Cuadrado extends Figura{
// Declaración de campos de instancia
/**
* Constructor de clase
*/
public Cuadrado(int dimensionPrincipal){
super(dimensionPrincipal);
}
/**
* método calcularArea
*/
public double calcularArea(){
return (Math.pow(dimensionPrincipal,2));
}
/**
* método equals
*/
@Override
public boolean equals(Object obj){
if(obj instanceof Cuadrado){
return super.equals(obj);
}
else{return false;}
}
Clase Circulo
/**
* Clase Circulo
*
* @author (RaGa)
* @version (20150428)
*/
public class Circulo extends Figura{
// Declaración de campos vacía
/**
* Constructor de clase
*/
public Circulo(int dimensionPrincipal){
super(dimensionPrincipal);
}
/**
* método calcularArea
*/
public double calcularArea(){
return (Math.PI*Math.pow(dimensionPrincipal,2));
}
/**
* método equals
*/
@Override
public boolean equals(Object obj){
if(obj instanceof Circulo){
return super.equals(obj);
}
else{return false;}
}
} // fin de la clase
Clase TestFigura
/**
* Clase TestFigura
*
* @author (RaGa)
* @version (20150428)
*/
public class TestFigura{
// Declaración de campos de clase vacía
/**
* Constructor de clase vacío
*/
public TestFigura(){
}
/**
* método main
*/
public static void main(String[] args){
// Creacion de los objetos
Figura cuadrado1 = new Cuadrado(5);
Figura cuadrado2 = new Cuadrado(8);
Figura cuadrado3 = new Cuadrado(5);
Figura circulo1 = new Circulo(7);
Figura circulo2 = new Circulo(8);
Figura circulo3 = new Circulo(7);
// Comparación de objetos
System.out.println("\fCOMPARACION ENTRE CUADRADOS");
System.out.println("¿Es cuadrado1 igual a cuadrado2? "+cuadrado1.equals(cuadrado2));
System.out.println("¿Es cuadrado1 igual a cuadrado3? "+cuadrado1.equals(cuadrado3));
System.out.println("¿Es cuadrado2 igual a cuadrado3? "+cuadrado2.equals(cuadrado3));
System.out.println("");
System.out.println("COMPARACION ENTRE CÍRCULOS");
System.out.println("¿Es circulo1 igual a circulo2? "+circulo1.equals(circulo2));
System.out.println("¿Es circulo1 igual a circulo3? "+circulo1.equals(circulo3));
System.out.println("¿Es circulo2 igual a circulo3? "+circulo2.equals(circulo3));
System.out.println("");
System.out.println("COMPARACION ENTRE UN CUADRADO Y UN CÍRCULO DE IGUAL DIMENSION PRINCIPAL");
System.out.println("¿Es circulo2 igual a cuadrado2? "+circulo1.equals(cuadrado2));
} // fin del main
} // fin de la clase
Se sobreescribió el método equals en la clase Figura, en la clase Cuadrado y en la clase Circulo.
La justificación es por motivos de modularidad y posible expansión en el futuro.
La clase Figura tiene un solo campo y es el que se compara en el método equals correspendiente a esta clase.
Si en el futuro se ampliara la cantidad de campos de la clase Figura y se estableciera como criterio de igualdad para todos los objetos Figura (además del campo dimensión principal) que fuera necesaria la igualdad de algún otro campo, dicha comparación se incluiría en esta clase.
De esta manera, no se repetiría código en cada una de las subclases que pudiera tener la clase Figura.
A su vez, cada subtipo sobreescribe el método equals lo cual les permite:
*) Primero establecer si lo que se están comparando son figuras del mismo tipo.
Si no estableciéramos esta comparación previa y solo usáramos el método equals de la superclase, obtendríamos un 'true' si comparamos un cuadrado y un círculo con la misma valor de campo dimension principal.
*) Cada método sobreescrito equals de cada subclase llama al método equals de la superclase para comprobar si cumple todos los requisitos de igualdad de la superclase Figura. (Hoy es un solo criterio, pero pueden ser muchos).
*) Pero además es necesario que cada subclase sobreescriba el método equals para poder establecer (en un futuro) criterios de igualdad que no son comunes a todos los objetos tipo Figura.
Por ejemplo: si en una posible ampliación de código, la clase Figura incorporara el campo 'color', y el criterio de color no fuera una condicion de igualdad para la clase Cuadrado pero sí para los objetos tipo Circulo, estableceríamos esa comparación del color en el método equals de la clase Circulo.