EDIT
ho appena notato utilizzato l'uguaglianza di classe, non instanceof
- il che significa che la riflessività sarebbe essere corretta. Nel tuo esempio, l'uso di super.equals
è probabilmente corretto, purché la superclasse non fornisca una definizione di uguaglianza che è contro quella che la tua sottoclasse desidera (come ad esempio Object
).
Il punto principale è che la definizione di uguaglianza dovrebbe provenire esattamente da un tipo (classe o interfaccia) nella gerarchia della classe. Se l'implementazione di tale definizione si avvale di super.equals
, va bene.
END EDIT, testo originale sotto
E 'quasi certamente la cosa sbagliata da fare, perché violerebbe la proprietà riflettente di uguaglianza.
Supponiamo di avere una forma ed è uguale a un'altra forma se sono dello stesso tipo: quadrato uguale a quadrato, cerchio uguale a cerchio, ecc. Ora lo estendi per creare una cornice colorata che aggiunge un controllo del colore.
Shape shape1 = new Shape(SQUARE);
Shape shape2 = new ColoredShape(SQUARE, RED);
Si implementa ColoredSquare.equals
come super.equals(other) && other.color == this.color
, come nella sua interrogazione. Ma ora, si noti che shape1.equals(shape2) == true
(dal shape1
utilizza solo il Shape.equals
), ma shape2.equals(shape1) == false
(poiché aggiunge il controllo del colore).
La morale della storia è che l'utilizzo di questo tipo di uguaglianza a cascata è davvero difficile, se non impossibile. Fondamentalmente, l'uguaglianza dovrebbe provenire esattamente da un tipo all'interno della tua gerarchia di tipi: sia Object
, il tuo tipo stesso, un super tipo, o qualche interfaccia che definisce un contratto (es. Nel quadro delle collezioni, che definisce l'uguaglianza per Set
, List
, ecc.).
P.S. Suppongo che la classe genitore non sia Object e dia la definizione corretta di 'equals' e' hashCode'. –