Câu trả lời ngắn gọn: Tính nhất quán
Tuy nhiên, để trả lời đúng câu hỏi của bạn, tôi đề nghị chúng ta lùi một bước và xem xét vấn đề về sự bình đẳng có nghĩa là gì trong ngôn ngữ lập trình. Có ít nhất BA khả năng khác nhau, được sử dụng trong các ngôn ngữ khác nhau:
- Bình đẳng tham chiếu : có nghĩa là a = b là đúng nếu a và b tham chiếu đến cùng một đối tượng. Sẽ không đúng nếu a và b đề cập đến các đối tượng khác nhau, ngay cả khi tất cả các thuộc tính của a và b là như nhau.
- Bình đẳng nông : có nghĩa là a = b là đúng nếu tất cả các thuộc tính của các đối tượng mà a và b tham chiếu là giống hệt nhau. Bình đẳng nông có thể dễ dàng được thực hiện bằng cách so sánh bitwise của không gian bộ nhớ đại diện cho hai đối tượng. Xin lưu ý rằng bình đẳng tham chiếu ngụ ý bình đẳng nông
- Bình đẳng sâu : có nghĩa là a = b là đúng nếu mỗi thuộc tính trong a và b giống hệt nhau hoặc bằng nhau sâu sắc. Xin lưu ý rằng bình đẳng sâu được ngụ ý bởi cả bình đẳng tham chiếu và bình đẳng nông. Theo nghĩa này, bình đẳng sâu sắc là hình thức bình đẳng yếu nhất và bình đẳng tham chiếu là mạnh nhất.
Ba loại đẳng thức này thường được sử dụng vì chúng thuận tiện để thực hiện: cả ba kiểm tra đẳng thức đều có thể dễ dàng được tạo bởi trình biên dịch (trong trường hợp đẳng thức sâu, trình biên dịch có thể cần sử dụng các bit thẻ để ngăn vòng lặp vô hạn nếu cấu trúc được so sánh có tài liệu tham khảo tròn). Nhưng có một vấn đề khác: không ai trong số này có thể phù hợp.
Trong các hệ thống không tầm thường, sự bình đẳng của các đối tượng thường được định nghĩa là một cái gì đó giữa bình đẳng sâu và tham chiếu. Để kiểm tra xem chúng ta có muốn coi hai đối tượng là bằng nhau trong một bối cảnh nhất định hay không, chúng ta có thể yêu cầu một số thuộc tính được so sánh bằng vị trí của nó trong bộ nhớ và các đối tượng khác bằng sự bình đẳng sâu sắc, trong khi một số thuộc tính có thể được phép hoàn toàn khác nhau. Những gì chúng tôi thực sự muốn là một loại bình đẳng của người Viking, một loại thực sự tốt đẹp, thường được gọi là bình đẳng ngữ nghĩa văn học . Mọi thứ đều bình đẳng nếu chúng bằng nhau, trong miền của chúng tôi. =)
Vì vậy, chúng tôi có thể trở lại câu hỏi của bạn:
Có một số lợi ích chính của việc mặc định cho điều này mà tôi đơn giản là thiếu, hoặc có vẻ hợp lý rằng hành vi mặc định phải là đẳng thức logic và mặc định trở lại đẳng thức tham chiếu nếu một đẳng thức logic không tồn tại cho lớp?
Chúng ta có ý nghĩa gì khi chúng ta viết 'a == b' bằng bất kỳ ngôn ngữ nào? Lý tưởng nhất, nó phải luôn giống nhau: Bình đẳng ngữ nghĩa. Nhưng điều đó không thể.
Một trong những cân nhắc chính là, ít nhất là đối với các loại đơn giản như số, chúng tôi hy vọng rằng hai biến bằng nhau sau khi gán cùng một giá trị. Xem bên dưới:
var a = 1;
var b = a;
if (a == b){
...
}
a = 3;
b = 3;
if (a == b) {
...
}
Trong trường hợp này, chúng tôi hy vọng rằng 'a bằng b' trong cả hai câu lệnh. Bất cứ điều gì khác sẽ là điên rồ. Hầu hết (nếu không phải tất cả) các ngôn ngữ tuân theo quy ước này. Do đó, với các loại đơn giản (còn gọi là giá trị), chúng ta biết cách đạt được sự bình đẳng ngữ nghĩa. Với các đối tượng, đó có thể là một cái gì đó hoàn toàn khác. Xem bên dưới:
var a = new Something(1);
var b = a;
if (a == b){
...
}
b = new Something(1);
a.DoSomething();
b.DoSomething();
if (a == b) {
...
}
Chúng tôi hy vọng rằng 'nếu' đầu tiên sẽ luôn luôn đúng. Nhưng bạn mong đợi điều gì ở 'nếu'? Nó thực sự phụ thuộc. 'DoS Something' có thể thay đổi đẳng thức (ngữ nghĩa) của a và b không?
Vấn đề với sự bình đẳng ngữ nghĩa là nó không thể được trình biên dịch tự động tạo ra cho các đối tượng, cũng như nó không rõ ràng từ các bài tập . Một cơ chế phải được cung cấp cho người dùng để xác định bình đẳng ngữ nghĩa. Trong các ngôn ngữ hướng đối tượng, cơ chế đó là một phương thức được kế thừa: bằng . Đọc một đoạn mã OO, chúng tôi không thể mong đợi một phương thức có cùng triển khai chính xác trong tất cả các lớp. Chúng ta đã quen với sự kế thừa và quá tải.
Tuy nhiên, với các nhà khai thác, chúng tôi mong đợi hành vi tương tự. Khi bạn thấy 'a == b', bạn sẽ mong đợi cùng một loại đẳng thức (từ 4 ở trên) trong mọi tình huống. Vì vậy, hướng đến sự thống nhất, các nhà thiết kế ngôn ngữ đã sử dụng sự bình đẳng tham chiếu cho tất cả các loại. Nó không nên phụ thuộc vào việc một lập trình viên có ghi đè một phương thức hay không.
PS: Ngôn ngữ Dee hơi khác so với Java và C #: toán tử bằng có nghĩa là bình đẳng nông cho các loại đơn giản và bình đẳng ngữ nghĩa cho các lớp do người dùng định nghĩa (có trách nhiệm thực hiện thao tác = nằm với người dùng - không được cung cấp mặc định). Vì, đối với các loại đơn giản, bình đẳng nông luôn là bình đẳng ngữ nghĩa, ngôn ngữ là nhất quán. Tuy nhiên, giá mà nó phải trả là toán tử bằng được mặc định không xác định cho các loại do người dùng xác định. Bạn phải thực hiện nó. Và, đôi khi, những điều đó thật nhàm chán.