Lorsque les anciens dieux de la programmation inventaient la programmation orientée objet avec les classes, ils décidaient, en matière de composition et d'héritage, d'avoir deux relations pour un objet: "est un" et "a un".
Cela a partiellement résolu le problème des sous-classes différentes des classes parentes mais les a rendues utilisables sans casser le code. Parce qu'une instance de sous-classe "est un" objet de super-classe et peut y être substitué directement, même si la sous-classe a plus de fonctions membres ou de membres de données, le "a a" garantit qu'il exécutera toutes les fonctions du parent et aura toutes ses fonctions. membres. On pourrait donc dire qu'un Point3D "est un" Point, et un Point2D "est un" Point s'ils héritent tous les deux de Point. De plus, un Point3D pourrait être une sous-classe de Point2D.
Cependant, l'égalité entre les classes est spécifique au domaine du problème et l'exemple ci-dessus est ambigu quant à ce dont le programmeur a besoin pour que le programme fonctionne correctement. En règle générale, les règles du domaine mathématique sont suivies et les valeurs des données génèrent une égalité si vous limitez la portée de la comparaison à deux dimensions dans ce cas, mais pas si vous comparez tous les membres des données.
Vous obtenez donc un tableau de réduction des égalités:
Both objects have same values, limited to subset of shared members
Child classes can be equal to parent classes if parent and childs
data members are the same.
Both objects entire data members are the same.
Objects must have all same values and be similar classes.
Objects must have all same values and be the same class type.
Equality is determined by specific logical conditions in the domain.
Only Objects that both point to same instance are equal.
Vous choisissez généralement les règles les plus strictes que vous pouvez encore exécuter toutes les fonctions nécessaires dans votre domaine problématique. Les tests d'égalité intégrés pour les nombres sont conçus pour être aussi restrictifs que possible à des fins mathématiques, mais le programmeur a de nombreuses façons de contourner cela si ce n'est pas le but, y compris l'arrondi vers le haut / vers le bas, la troncature, gt, lt, etc. . Les objets avec horodatage sont souvent comparés en fonction de leur temps de génération et chaque instance doit donc être unique pour que les comparaisons deviennent très spécifiques.
Le facteur de conception dans ce cas est de déterminer des moyens efficaces de comparer des objets. Parfois, une comparaison récursive de tous les objets membres de données est ce que vous devez faire, et cela peut devenir très coûteux si vous avez beaucoup, beaucoup d'objets avec beaucoup de membres de données. Les alternatives consistent à comparer uniquement les valeurs de données pertinentes, ou à faire générer par l'objet une valeur de hachage de ses membres de données concernés pour une comparaison rapide avec d'autres objets similaires, à conserver les collections triées et élaguées pour rendre les comparaisons plus rapides et moins gourmandes en CPU, et peut-être à autoriser les objets qui sont identiques dans les données à éliminer et un pointeur en double vers un seul objet soit mis à sa place.