Pregunta 4 · Programació II UDL 2021
Tema: Diseño de clases y objetos en Java, herencia e igualdad · Del examen Examen Primer Parcial (Noviembre 2021) (2021)
Enunciado
Pregunta 4 (2,5 puntos). Implementación del método equals en Rectangle con y sin interoperabilidad
Dadas las siguientes clases Java:
public class Rectangle {
final int width;
final int height;
public Rectangle(int width, int height) {
this.width = width;
this.height = height;
}
public int getWidth() { return width; }
public int getHeight() { return height; }
}
public class ColoredRectangle extends Rectangle {
private Color color;
public ColoredRectangle(int width, int height, Color color) {
super(width, height);
this.color = color;
}
public Color getColor() { return color; }
}
Implementa el método equals(Object obj) dentro de Rectangle de dos formas distintas:
a.
De modo que no sea interoperable con ColoredRectangle (una instancia de ColoredRectangle nunca se considerará igual a una de Rectangle).
b.
De modo que sea interoperable con subclases como ColoredRectangle (se puedan comparar atendiendo a las dimensiones de Rectangle sin violar simetría).
Explica y justifica razonadamente las diferencias técnicas entre ambas implementaciones.

Solución
Según los criterios oficiales de corrección
a. De modo que no sea interoperable con ColoredRectangle (una instancia de ColoredRectangle nunca se considerará igual a una de Rectangle).
Solución: ```java public boolean equals(Object obj) { if (this == obj) return true; if (obj == null || this.getClass() != obj.getClass()) return false; Rectangle other = (Rectangle) obj; return this.width == other.width && this.height == other.height; } ```
b. De modo que sea interoperable con subclases como ColoredRectangle (se puedan comparar atendiendo a las dimensiones de Rectangle sin violar simetría).
Solución: ```java public boolean equals(Object obj) { if (this == obj) return true; if (!(obj instanceof Rectangle)) return false; Rectangle other = (Rectangle) obj; return this.width == other.width && this.height == other.height; } ```
Explica y justifica razonadamente las diferencias técnicas entre ambas implementaciones.
Solución: No interoperable (getClass()): Al comprobar this.getClass() != obj.getClass(), se exige que ambos objetos pertenezcan de forma estricta y exacta a la clase Rectangle. Si obj es una instancia de ColoredRectangle, las clases difieren y equals devolverá false. Esto garantiza siempre las propiedades reflexiva, simétrica y transitiva entre jerarquías, a costa de impedir cualquier equivalencia entre una superclase y una subclase. Interoperable (instanceof): El operador instanceof evalúa a true no solo para Rectangle, sino también para cualquier instancia de una subclase (como ColoredRectangle). Esto permite que un Rectangle pueda compararse con un ColoredRectangle considerando exclusivamente las dimensiones comunes (ancho y alto). No obstante, para que la relación siga siendo simétrica y transitiva, las subclases no deben intentar redefinir equals añadiendo campos propios si se comparan con la superclase.
La explicación paso a paso, hecha con IA, es Premium. Premium
Resuélvelo aquí mismo: corrección automática, pistas y solución paso a paso.