Когда старые боги программирования изобретали объектно-ориентированное программирование с классами, они решили, когда дело доходит до композиции и наследования, иметь два отношения для объекта: «является» и «имеет».
Это частично решило проблему отличия подклассов от родительских классов, но сделало их пригодными для использования без нарушения кода. Поскольку экземпляр подкласса «является» объектом суперкласса и может быть заменен непосредственно на него, даже если подкласс имеет больше функций-членов или элементов данных, «has a» гарантирует, что он будет выполнять все функции родительского элемента и будет иметь все свои члены. Таким образом, вы можете сказать, что Point3D - это «Point, а Point2D» - это «Point», если они оба наследуются от Point. Кроме того, 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 и т. Д. , Объекты с временными метками часто сравниваются по времени их генерации, поэтому каждый экземпляр должен быть уникальным, чтобы сравнения становились очень конкретными.
Фактором проектирования в этом случае является определение эффективных способов сравнения объектов. Иногда вам нужно сделать рекурсивное сравнение всех элементов данных объектов, и это может оказаться очень дорогостоящим, если у вас много и много объектов с множеством элементов данных. Альтернативы состоят в том, чтобы сравнивать только релевантные значения данных или заставить объект генерировать хеш-значение из соответствующих элементов данных для быстрого сравнения с другими подобными объектами, сортировать и сокращать коллекции, чтобы проводить сравнения быстрее и менее интенсивно, и, возможно, разрешать объекты, которые идентичны в данных, которые будут отбракованы, и на его место будет помещен дублирующий указатель на один объект.