EDIT
Tôi chỉ nhận thấy bạn sử dụng bình đẳng giai cấp, không instanceof
- nghĩa là tính phản xạ sẽ là đúng. Trong ví dụ của bạn, việc sử dụng super.equals
có lẽ là chính xác, miễn là lớp cha không cung cấp định nghĩa về bình đẳng mà ngược lại với lớp con bạn muốn (ví dụ: Object
).
Điểm chính là định nghĩa về bình đẳng phải đến từ chính xác một loại (lớp hoặc giao diện) trong phân cấp lớp của bạn. Nếu việc thực hiện định nghĩa đó tận dụng lợi thế của super.equals
, điều đó là tốt.
END EDIT, văn bản gốc bên dưới
Đó là gần như chắc chắn điều sai trái để làm, bởi vì nó sẽ vi phạm sở hữu phản xạ bình đẳng.
Giả sử bạn có Hình dạng và hình dạng đó giống với Hình dạng khác nếu chúng cùng loại: Hình vuông bằng Vuông, Vòng tròn bằng Hình tròn, v.v. Bây giờ bạn mở rộng để tạo một Màu sắc cho phép thêm kiểm tra màu.
Shape shape1 = new Shape(SQUARE);
Shape shape2 = new ColoredShape(SQUARE, RED);
Bạn thực hiện ColoredSquare.equals
như super.equals(other) && other.color == this.color
, như trong câu hỏi của bạn. Nhưng bây giờ, lưu ý rằng shape1.equals(shape2) == true
(kể từ shape1
chỉ sử dụng Shape.equals
), nhưng shape2.equals(shape1) == false
(vì nó thêm kiểm tra màu).
Đạo đức của câu chuyện là việc sử dụng loại bình đẳng tầng này thực sự khó khăn, nếu không phải là không thể. Về cơ bản, bình đẳng nên đến từ chính xác một loại trong phân cấp kiểu của bạn - có thể là Object
, loại của bạn, loại siêu hoặc giao diện xác định hợp đồng (ví dụ: trong khung bộ sưu tập, xác định sự bình đẳng cho Set
, List
, v.v.).
P.S. Tôi giả định rằng lớp cha không phải là đối tượng và đưa ra định nghĩa đúng của 'equals' và' hashCode'. –