2010-09-21 2 views
1

Comment puis-je comparer un objet de classe de base avec un objet de classe dérivé dans une classe dérivée? Je dois obtenir true en sortie à partir du code ci-dessous:Comment comparer l'objet de classe dérivé avec l'objet Java de classe de base?

class Base { 
    int i; 
    String str; 
} 

class Derived extends Base{ 
    double d; 
    String str1; 

    public static void main(String []a){ 
     Base b= new Base(); 
     Derived d = new Derived(); 
     System.out.println("Equals! :"+d.equals(b)); 
    } 
} 

Il me donne toujours false en sortie. Comment puis-je comparer la classe de base avec la classe dérivée?

Répondre

1

L'égalité d'objet est généralement définie pour les objets de la même classe, par exemple: Vous pouvez vouloir que deux objets Base b1, b2 soient égaux si leur str et i valeurs sont égales Ensuite, vous devez définir les equals() (et, généralement, hashCode()) méthodes pour tester cette condition. par exemple:.

public boolean equals(Object obj) 
{ 
    // test for identity 
    if (this == obj) return true; 

    // check that obj is not null, and that it is an instance of Base 
    if (obj == null) return false; 
    if (getClass() != obj.getClass()) return false; 

    // compare attributes 
    Base other = (Base) obj; 
    if (i != other.i) return false; 
    if (str == null && other.str != null) return false; 
    if (!str.equals(other.str)) return false; 
    return true; 
} 

Dans votre cas, puisque Base et Derived sont différentes classes , avec différents attributs (Base a str et i, alors que Derived a str, i, str1 et d), vous devez définir exactement quand un objet Base et un objet Derived doivent être égaux.

1

Eh bien, pour le faire revenir juste vrai est assez facile:

@Override 
public boolean equals(Object other) { 
    return true; 
} 

Cependant, je dirais que ce n'est pas ce que vous devriez être faites (même dans une mise en œuvre un peu moins trivial).

Je pense que la méthode equals de Object ne doit pas renvoyer true sauf si les types sont réellement les mêmes. Sinon, cela finit par rendre la vie vraiment difficile en s'assurant que les aspects de symétrie requis par Object.equals(Object) sont remplis. Il n'a pas non plus l'impression d'atteindre l'égalité naturelle à ce moment-là.

Cependant, il serait tout à fait raisonnable d'écrire une classe qui est capable de comparer deux instances de Base pour l'égalité dans votre cas spécifique. La bonne chose à propos des comparateurs d'égalité est qu'ils n'ont pas à être aussi naturels - vous ne définissez pas ce que l'égalité devrait signifier pour l'ensemble - vous ne faites que décrire une comparaison spécifique.

Il est regrettable que Java n'ait pas d'interface EqualityComparator<T> (ou autre) avec Comparator<T>. Cela rend beaucoup plus difficile de créer (par exemple) des cartes et des ensembles qui utilisent une idée spécifique d'égalité (et un code de hachage pour l'accompagner). Cela peut ou peut ne pas être un problème dans votre cas - comment espérez-vous utiliser cette comparaison d'égalité de toute façon? Si c'est dans votre propre code, vous pouvez écrire votre propre interface EqualityComparator<T>. Si vous voulez construire une carte ou un ensemble, ça ne va pas être aussi simple :(

Questions connexes