구 프로그래밍 신들이 클래스를 가진 객체 지향 프로그래밍을 발명 할 때, 객체에 대해 "is a"와 "has a"라는 두 가지 관계를 갖는 것이 구성과 상속에 관한 시점을 결정했습니다.
이것은 서브 클래스가 부모 클래스와 다른 문제를 부분적으로 해결했지만 코드를 손상시키지 않고 사용할 수있게했습니다. 서브 클래스 인스턴스는 "수퍼 클래스 객체"이고이를 직접 대체 할 수 있기 때문에 서브 클래스에 더 많은 멤버 함수 또는 데이터 멤버가 있더라도 "있다"는 부모의 모든 함수를 수행하고 모든 회원. 따라서 Point3D는 "is a"Point이고 Point2D는 둘 다 Point에서 상속하는 경우 "is"라고 말할 수 있습니다. 또한 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 등을 포함하여 목표가 아닌 경우 프로그래머는 여러 가지 방법을 사용할 수 있습니다. . 타임 스탬프가있는 객체는 생성 시간으로 비교되는 경우가 많으므로 각 인스턴스는 고유해야하므로 비교가 매우 구체화됩니다.
이 경우 설계 요소는 객체를 비교하는 효율적인 방법을 결정하는 것입니다. 때로는 모든 객체 데이터 멤버를 재귀 적으로 비교하는 것이 당신이해야 할 일이며 많은 데이터 멤버가있는 많은 객체가있는 경우 매우 비쌀 수 있습니다. 대안은 관련 데이터 값만 비교하거나, 객체가 다른 유사한 객체와의 빠른 비교를 위해 관련 데이터 멤버의 해시 값을 생성하도록하고, 더 빠르고 덜 CPU 집약적 인 비교를 수행하기 위해 콜렉션을 정렬하고 정리하는 것입니다. 컬링 할 데이터가 동일하고 단일 오브젝트에 대한 중복 포인터가 대신 배치됩니다.