creo que está cerca, pero que se está perdiendo algunos conceptos clave. Esto se debe a que su "tal cual" no funcionará en todas las situaciones. Pruebe esto, por ejemplo, usando su código existente ...
Fraction a = // this is however you're making a fraction object...
Fraction b = // do EXACT same thing here that you did for a
// And then, this will illustrate what is wrong with your program...
if(a.equals(b)) {
System.out.println("This won't print");
} else {
System.out.println("This will print because your method just checks for reference");
}
Así que aquí están los conceptos básicos que hay que entender:
- Diferencia entre
==
y equals
- Comparando tipo en lugar de hacer referencia o valor
- Evitar la fundición poniendo su "es igual a" método en el lugar correcto
Primero de ...
public boolean equals(Object other){
if (other == this){
return true;
} else {
return false;
}
}
Te estás perdiendo el punto del método "igual" en Java. ==
se usa para comparar referencias, mientras que this.equals(foo)
se usa para poner la lógica para comparar objetos en un lugar localizado.
El otro concepto que te falta es cómo se debe usar instanceof. Cuando se le pregunta esto ...
Si intento otro == Fracción, no se compila.
Esto es porque estás buscando comparar el tipo de objeto. Para ello, sólo tendría que hacer ...
if(other instanceOf Fraction) {
// do stuff...
}
Todo eso se dice, hay un último concepto, que está poniendo la definición iguales en el lugar adecuado. Es necesario poner dentro de su clase Fracción y definir así ...
public boolean equals(Fraction other) {
// do something like this (you will have to define toDouble)
if(this == other || this.toDouble() == other.toDouble()) {
return true;
}
return false;
}
Esto anulará el valor por defecto ...
public boolean equals(Object other) {/* ... */}
y hará que sea muy conveniente. Aquí hay un código de ejemplo de cómo ...
Fraction fractionA = new Fraction("2/4");
Fraction fractionB = new Fraction("1/2");
Fraction fractionC = new Fraction("1/3");
Object trollObject = new Object();
// And then call random equals objects...
if(fractionA.equals(fractionB)) {
// should be true...
}
if(fractionB.equals(fractionA)) {
// should be true...
}
// This avoids having to do any casting because
// since you've only defined a Fraction.equals(Fraction) method
// it should instead default to the Object.equals method
if(trollObject.equals(fractionB)) {
}
¿Sabes qué clases vienen como 'otras'? Además, ¡+1 para marcar esta tarea y una pregunta bien planteada! – macduff
Tenga en cuenta que la mayoría de las respuestas hasta ahora fallarán si 'other' implementa' FractionInterface' pero no es de clase 'Fraction'. Debe tener claro si desea una solución que funcione solo cuando 'other' sea una instancia de' Fraction', o una que funcione cuando 'other' sea una instancia de' Fraction' o una de sus subclases, o una eso funciona para cualquier objeto que implemente 'FractionInterface'. Necesita un código diferente para cada caso. –