Коли старі боги програмування винайшли об'єктно-орієнтоване програмування з класами, вони вирішили, коли справа доходить до складу та успадкування мати два відношення для об'єкта: "є" і "має".
Це частково вирішило проблему, що підкласи відрізняються від батьківських класів, але зробила їх корисними, не порушуючи код. Оскільки екземпляр підкласу "є" об'єктом надкласового класу і його можна замінити безпосередньо, навіть незважаючи на те, що підклас має більше функцій-членів або членів даних, "має" гарантує, що він буде виконувати всі функції батьківського рівня і мати всі його члени. Отже, ви можете сказати, що Point3D "- це" точка, а Point2D "-" точка, якщо вони обидва успадковують від точки. Крім того, Point3D може бути підкласом Point2D.
Равенство між класами, однак, залежить від домену, і наведений вище приклад є неоднозначним щодо того, що потрібно програмісту, щоб програма працювала правильно. Як правило, дотримуються правил математичної доменності, і значення даних створюють рівність, якщо ви обмежите обсяг порівняння лише в цьому випадку двома вимірами, але не, якщо порівнювати всіх членів даних.
Отже, ви отримуєте таблицю звуження рівностей:
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.
Як правило, ви вибираєте найсуворіші правила, які ви все одно зможете виконувати всі необхідні функції у вашій проблемній області. Вбудовані тести рівності для чисел розроблені настільки ж обмежуючими, наскільки вони можуть бути для математичних цілей, але програміст має багато способів цього, якщо це не мета, включаючи округлення вгору / вниз, усічення, gt, lt тощо . Об'єкти із часовими позначками часто порівнюють за часом їх генерації, тому кожен екземпляр повинен бути унікальним, щоб порівняння стали дуже конкретними.
Фактор проектування в цьому випадку полягає у визначенні ефективних способів порівняння об'єктів. Іноді потрібно робити рекурсивне порівняння всіх членів даних об’єктів, і це може стати дуже дорогим, якщо у вас є багато і багато об'єктів з великою кількістю членів даних. Альтернативи - лише порівняти відповідні значення даних або змусити об'єкт генерувати хеш-значення своїх зацікавлених членів даних для швидкого порівняння з іншими подібними об'єктами, зберігати колекції впорядкованими та підрізаними, щоб зробити порівняння більш швидкими та менш інтегрованими процесорами та, можливо, дозволити об'єкти, які однакові в даних, які підлягають збиттю, і на його місце ставиться дублікат вказівника на один об'єкт.