Khi các vị thần lập trình cũ đang phát minh ra lập trình hướng đối tượng với các lớp, họ đã quyết định khi nói đến thành phần và kế thừa có hai mối quan hệ cho một đối tượng: "là một" và "có một".
Điều này đã giải quyết một phần vấn đề của các lớp con khác với các lớp cha nhưng làm cho chúng có thể sử dụng được mà không vi phạm mã. Bởi vì một thể hiện của lớp con "là một" đối tượng siêu lớp và có thể được thay thế trực tiếp cho nó, mặc dù lớp con có nhiều hàm thành viên hoặc thành viên dữ liệu hơn, "có" đảm bảo nó sẽ thực hiện tất cả các chức năng của cha mẹ và có tất cả các chức năng của nó các thành viên. Vì vậy, bạn có thể nói Point3D "là" Điểm và Điểm2D "là" Điểm nếu cả hai đều thừa hưởng từ Điểm. Ngoài ra, Point3D có thể là một lớp con của Point2D.
Tuy nhiên, sự bình đẳng giữa các lớp là vấn đề cụ thể theo miền, và ví dụ trên không rõ ràng về những gì lập trình viên cần để chương trình hoạt động chính xác. Nói chung, các quy tắc miền toán học được tuân theo và các giá trị của dữ liệu sẽ tạo ra sự bình đẳng nếu bạn giới hạn phạm vi so sánh chỉ trong trường hợp này là hai chiều, nhưng không phải nếu bạn so sánh tất cả các thành viên dữ liệu.
Vì vậy, bạn nhận được một bảng thu hẹp công bằng:
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.
Bạn thường chọn các quy tắc nghiêm ngặt nhất mà bạn có thể vẫn sẽ thực hiện tất cả các chức năng cần thiết trong miền vấn đề của bạn. Các bài kiểm tra đẳng thức tích hợp cho các số được thiết kế hạn chế nhất có thể cho mục đích toán học, nhưng lập trình viên có nhiều cách để làm điều đó nếu đó không phải là mục tiêu, bao gồm làm tròn lên / xuống, cắt, gt, lt, v.v. . Các đối tượng có dấu thời gian thường được so sánh theo thời gian tạo của chúng và do đó mỗi trường hợp phải là duy nhất để các phép so sánh trở nên rất cụ thể.
Yếu tố thiết kế trong trường hợp này là xác định các cách hiệu quả để so sánh các đối tượng. Đôi khi một so sánh đệ quy của tất cả các thành viên dữ liệu đối tượng là những gì bạn phải làm và điều đó có thể rất tốn kém nếu bạn có rất nhiều đối tượng có nhiều thành viên dữ liệu. Các lựa chọn thay thế là chỉ so sánh các giá trị dữ liệu có liên quan hoặc để đối tượng tạo ra giá trị băm của các thành viên dữ liệu liên quan để so sánh nhanh với các đối tượng tương tự khác, giữ cho các bộ sưu tập được sắp xếp và cắt tỉa để so sánh nhanh hơn và ít cpu hơn và có thể cho phép các đối tượng là giống hệt nhau trong dữ liệu được loại bỏ và một con trỏ trùng lặp đến một đối tượng được đặt vào vị trí của nó.