Foros aprenderaprogramar.com
Aprender a programar => Aprender a programar desde cero => Mensaje iniciado por: rubens23 en 29 de Agosto 2015, 11:50
-
Sobreescribir métodos toString y equals en Java. Ejemplos. Ejercicios resueltos. Comparar objetos.
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
package aprender;
public class Figura {
protected double dimensionPrincipal;
public Figura (double dimensionPrincipal){
this.dimensionPrincipal = dimensionPrincipal;
}
public boolean equals (Object obj){
if (obj instanceof Figura){
Figura tmpFigura = (Figura) obj;
if (this.dimensionPrincipal == tmpFigura.dimensionPrincipal){
return true;
}
else{
return false;
}}
else{
return false;
}
}
}
Clase Circulo
package aprender;
public class Circulo extends Figura {
public static final double PI = 3.1416;
public Circulo(double dimensionPrincipal){
super (dimensionPrincipal);
}
/*
public void setRadio(double añadirRadio){
radio = añadirRadio;
}
public double getRadio(){
return radio;
}*/
public double areaCirculo(){
double area;
area = PI *(dimensionPrincipal*dimensionPrincipal);
return area;
}/*
public double longitud(){
double longitud;
longitud = 2 * PI * radio;
return longitud;
}*/
public boolean equals (Object obj){
if (obj instanceof Circulo){
Circulo tmpCirculo = (Circulo) obj;
if(super.equals(tmpCirculo)){
return true;
}
else{
return false;
}}
else{
return false;
}
}}
Clase Cuadrado
package aprender;
public class Cuadrado extends Figura {
public Cuadrado (double dimensionPrincipal){
super(dimensionPrincipal);
}
public double areaCirculo(){
double area;
area = dimensionPrincipal * dimensionPrincipal;
return area;
}
public boolean equals (Object obj){
if (obj instanceof Cuadrado){
Cuadrado tmpCuadrado = (Cuadrado) obj;
if (super.equals(tmpCuadrado)){
return true;
}
else {
return false;
}}
else {
return false;
}
}
}
Clase TestSobreescribirEquals
package aprender;
public class TestSobreescribirEquals {
public static void main (String [] args){
Figura figura1 = new Circulo (13);
Figura figura2 = new Cuadrado(13);
Cuadrado cuadrado1 = new Cuadrado (12);
Cuadrado cuadrado2 = new Cuadrado (12);
Cuadrado cuadrado3 = new Cuadrado (13);
Circulo circulo1 = new Circulo(30);
Circulo circulo2 = new Circulo (30);
Circulo circulo3 = new Circulo (23);
System.out.println("¿Cuadrado 1 y cuadrado 2 con la misma dimension principal? "+cuadrado1.equals(cuadrado2));
System.out.println("¿Cuadrado 1 y cuadrado 3 con la misma dimension principal? "+cuadrado1.equals(cuadrado3));
System.out.println("¿Circulo 1 y circulo 2 con la misma dimension principal? " +circulo1.equals(circulo2));
System.out.println("¿Circulo 1 y circulo 3 con la misma dimension principal? "+circulo1.equals(circulo3));
System.out.println("¿Figura 1 y figura 2 son iguales? "+ figura1.equals(figura2));
System.out.println("¿Figura 2 y cuadrado 3 son iguales? "+ cuadrado3.equals(figura2));
System.out.println("Area del circulo 1 es: "+ circulo1.areaCirculo()+"\nArea del circulo 2 es: "+ circulo2.areaCirculo());
}
}
En esta clase he hecho algunas comprobaciones que me surgían dudas, pero ya las he resuelto. Espero que esté bien.
Un saludo y espero vuestra respuesta.
-
Hola Rubens:
Estuve analizando tu ejercicio y lo veo bien, cumple a la perfección lo que se pide en el enunciado.
De todos modos creo que los métodos sobreescritos equals en la clase Cuadrado y en la clase Circulo podrían mejorarse haciendo uso de la herencia.
Dichos métodos podrían bien codificarse de la siguiente manera:
método equals de la clase Circulo:
public boolean equals (Object obj){
if (obj instanceof Circulo){
return super.equals(obj);
}
else{
return false;
}
}
método equals de la clase Cuadrado:
public boolean equals (Object obj){
if (obj instanceof Cuadrado){
return super.equals(obj);
}
else{
return false;
}
}
Analízalo y cualquier duda estamos aquí para revisarlo nuevamente.
-
Si, tienes razón. Podría haberlo hecho así, pero como al ser la clase de tipo boolean pensé que sólo puede devolver un true o false, y ni siquiera se me ha pasado por la cabeza que pudiera devolver el método de la superclase. Pero al ser otro método tipo boolean que devuelve true o false, si se puede.
A veces voy tan decidido en hacerlo de una manera que no pienso en otras posibilidades muy obvias y más correctas.
Muchas gracias por responder y lo tendré en cuenta para
los próximos códigos.
Un saludo.