Als die alten Programmiergötter das objektorientierte Programmieren mit Klassen erfanden, entschieden sie sich, wenn es um Komposition und Vererbung ging, zwei Beziehungen für ein Objekt zu haben: "ist ein" und "hat ein".
Dies löste teilweise das Problem, dass Unterklassen sich von übergeordneten Klassen unterschieden, sie jedoch verwendbar machten, ohne Code zu brechen. Da eine Unterklasseninstanz "ein" Oberklassenobjekt ist und direkt durch ein Objekt ersetzt werden kann, obwohl die Unterklasse mehr Elementfunktionen oder Datenelemente enthält, garantiert "a", dass alle Funktionen des übergeordneten Objekts ausgeführt werden und alle Funktionen vorhanden sind Mitglieder. Man könnte also sagen, ein Point3D ist ein Point, und ein Point2D ist ein Point, wenn beide von Point erben. Zusätzlich kann ein Point3D eine Unterklasse von Point2D sein.
Die Klassengleichheit ist jedoch problemdomänenspezifisch, und das obige Beispiel ist nicht eindeutig, was der Programmierer benötigt, damit das Programm ordnungsgemäß funktioniert. Im Allgemeinen werden Regeln für mathematische Domänen befolgt, und Datenwerte führen zu Gleichheit, wenn Sie den Umfang des Vergleichs auf nur zwei Dimensionen beschränken, aber nicht, wenn Sie alle Datenelemente vergleichen.
So erhalten Sie eine Tabelle mit einschränkenden Gleichungen:
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.
Sie wählen im Allgemeinen die strengsten Regeln, die Sie können, um dennoch alle erforderlichen Funktionen in Ihrer Problemdomäne auszuführen. Die eingebauten Gleichheitstests für Zahlen sind so restriktiv wie möglich für mathematische Zwecke, aber der Programmierer hat viele Möglichkeiten, um dies zu umgehen, wenn dies nicht das Ziel ist, einschließlich Auf- / Abrunden, Abschneiden, gt, lt usw . Objekte mit Zeitstempeln werden häufig nach ihrer Generierungszeit verglichen. Daher muss jede Instanz eindeutig sein, damit Vergleiche sehr spezifisch werden.
In diesem Fall besteht der Entwurfsfaktor darin, effiziente Methoden zum Vergleichen von Objekten zu bestimmen. Manchmal ist ein rekursiver Vergleich aller Objektdatenelemente erforderlich, und dies kann sehr teuer werden, wenn Sie viele, viele Objekte mit vielen Datenelementen haben. Alternativ können Sie nur relevante Datenwerte vergleichen oder das Objekt einen Hash-Wert der betroffenen Datenelemente generieren lassen, um einen schnellen Vergleich mit anderen ähnlichen Objekten zu ermöglichen. Sie können Sammlungen sortieren und bereinigen, um Vergleiche zu beschleunigen und weniger CPU-intensiv zu machen, und möglicherweise Objekte zulassen, die dies zulassen Daten identisch sind, die gekeult werden sollen, und ein doppelter Zeiger auf ein einzelnes Objekt an seine Stelle gesetzt wird.