Kiedy dawni bogowie programowania wymyślali programowanie obiektowe za pomocą klas, zdecydowali, kiedy chodzi o kompozycję i dziedziczenie, aby mieć dwa relacje dla obiektu: „jest” i „ma”.
To częściowo rozwiązało problem, że podklasy różnią się od klas nadrzędnych, ale uczyniły je użytecznymi bez łamania kodu. Ponieważ instancja podklasy „jest” obiektem nadklasy i można go bezpośrednio zastąpić, nawet jeśli podklasa ma więcej funkcji składowych lub elementów danych, „ma” gwarantuje, że wykona wszystkie funkcje elementu nadrzędnego i będzie mieć wszystkie członkowie. Można więc powiedzieć, że Point3D ”to„ Point, a Point2D ”to„ Point, jeśli oba dziedziczą po Point. Dodatkowo Point3D może być podklasą Point2D.
Równość między klasami jest jednak specyficzna dla dziedziny, a powyższy przykład jest dwuznaczny co do tego, czego programista potrzebuje, aby program działał poprawnie. Zasadniczo przestrzegane są reguły domeny matematycznej, a wartości danych generowałyby równość, jeśli ograniczysz zakres porównania tylko w tym przypadku do dwóch wymiarów, ale nie w przypadku porównania wszystkich elementów danych.
Otrzymujesz więc tabelę zawężających się równości:
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.
Zazwyczaj wybierasz najsurowsze reguły, które możesz nadal wykonywać wszystkie niezbędne funkcje w domenie problemowej. Wbudowane testy równości dla liczb są tak restrykcyjne, jak mogą być do celów matematycznych, ale programista ma wiele sposobów na to, jeśli to nie jest cel, w tym zaokrąglanie w górę / w dół, obcinanie, gt, lt itp. . Obiekty ze znacznikami czasu są często porównywane według czasu ich wygenerowania, dlatego każde wystąpienie musi być unikalne, aby porównania były bardzo szczegółowe.
Czynnikiem projektowym w tym przypadku jest określenie skutecznych sposobów porównywania obiektów. Czasami musisz wykonać rekurencyjne porównanie wszystkich elementów danych z elementami, co może być bardzo kosztowne, jeśli masz wiele obiektów z dużą liczbą elementów danych. Alternatywą jest porównywanie tylko odpowiednich wartości danych lub sprawienie, by obiekt wygenerował wartość skrótu danych elementów, których to dotyczy, w celu szybkiego porównania z innymi podobnymi obiektami, utrzymywania kolekcji posortowanych i przycinanych, aby porównania były szybsze i mniej obciążające procesorem, a być może zezwalać obiektom, które są identyczne pod względem danych, które mają zostać ubite, a na ich miejsce należy umieścić zduplikowany wskaźnik do pojedynczego obiektu.