Коротка відповідь: Послідовність
Щоб правильно відповісти на ваше запитання, я пропоную зробити крок назад і звернутися до питання про те, що означає рівність у мові програмування. Є щонайменше ТРИ різних можливостей, які використовуються різними мовами:
- Довідкова рівність : означає, що a = b є істинним, якщо a і b посилаються на один і той же об'єкт. Не було б правдою, якби a і b посилалися на різні об'єкти, навіть якби всі атрибути a і b були однаковими.
- Мала рівність : означає, що a = b є істинним, якщо всі атрибути об'єктів, на які посилаються a і b, однакові. Неглибока рівність може бути легко реалізована шляхом розрядного порівняння простору пам'яті, що представляє два об'єкти. Зверніть увагу, що довідкова рівність передбачає малу рівність
- Глибока рівність : означає, що a = b є істинним, якщо кожен атрибут в a і b є однаковим або глибоко рівним. Зверніть увагу, що глибока рівність має на увазі як опорну рівність, так і дрібну рівність. У цьому сенсі глибока рівність є найслабшою формою рівності, а референтна рівність - найсильнішою.
Ці три типи рівності часто використовуються, оскільки їх зручно реалізовувати: усі три перевірки рівності можуть бути згенеровані компілятором (у випадку глибокої рівності компілятору, можливо, потрібно буде використовувати біти тегів для запобігання нескінченних циклів, якщо структура Порівнювати має кругові посилання). Але є й інша проблема: жодне з них не може бути доречним.
У нетривіальних системах рівність об'єктів часто визначається як щось середнє між глибинною та еталонною рівністю. Щоб перевірити, чи хочемо ми вважати два об'єкти рівними в певному контексті, нам може знадобитися порівняння деяких атрибутів за місцем, де він стоїть в пам'яті, а інших за глибокою рівністю, тоді як деяким атрибутам взагалі може бути дозволено щось інакше. Ми б хотіли насправді «четвертого типу рівності», справді приємного, який часто в літературі називають смисловою рівністю . У нашому домі речі рівні, якщо вони рівні. =)
Тож ми можемо повернутися до вашого питання:
Чи є якась головна користь від дефолту в цьому, що я просто відсутній, або чи здається розумним, що поведінка за замовчуванням повинна бути логічною рівністю, і дефолт повертається до еталонної рівності, якщо логічної рівності для класу не існує?
Що ми маємо на увазі, коли пишемо 'a == b' будь-якою мовою? В ідеалі вона повинна бути завжди однаковою: семантична рівність. Але це неможливо.
Одне з головних міркувань полягає в тому, що, принаймні, для простих типів, таких як числа, ми очікуємо, що дві змінні рівні після присвоєння однакового значення. Дивись нижче:
var a = 1;
var b = a;
if (a == b){
...
}
a = 3;
b = 3;
if (a == b) {
...
}
У цьому випадку ми очікуємо, що "дорівнює b" в обох твердженнях. Все інше було б божевільним. Більшість (якщо не всі) мов дотримуються цієї конвенції. Тому за допомогою простих типів (також значень) ми знаємо, як домогтися смислової рівності. З предметами це може бути щось зовсім інше. Дивись нижче:
var a = new Something(1);
var b = a;
if (a == b){
...
}
b = new Something(1);
a.DoSomething();
b.DoSomething();
if (a == b) {
...
}
Ми очікуємо, що перше "якщо" завжди буде правдою. Але чого ви очікуєте на друге "якщо"? Це дійсно залежить. Чи може «DoSomething» змінити (семантичну) рівність a і b?
Проблема смислової рівності полягає в тому, що вона не може бути автоматично сформована компілятором для об'єктів, і це не очевидно з призначення . Користувачеві повинен бути передбачений механізм визначення смислової рівності. У об'єктно-орієнтованих мовах цей механізм є успадкованим методом: дорівнює . Читаючи фрагмент коду OO, ми не очікуємо, що метод має однакову точну реалізацію у всіх класах. Ми звикли успадковувати і перевантажувати.
Однак, з операторами ми очікуємо такої ж поведінки. Коли ви бачите "a == b", ви повинні очікувати однакового типу рівності (з 4 вище) у всіх ситуаціях. Отже, прагнучи до узгодженості, дизайнери мов використовували еталонну рівність для всіх типів. Це не повинно залежати від того, програміст перекрив метод чи ні.
PS: Мова Dee дещо відрізняється від Java та C #: оператор рівних означає дрібну рівність для простих типів та семантичну рівність для визначених користувачем класів (відповідальність за виконання операції = лежить з користувачем - за замовчуванням не передбачено). Оскільки для простих типів неглибока рівність - це завжди смислова рівність, мова є послідовною. Однак ціна, яку він платить, полягає в тому, що оператор рівних за замовчуванням не визначений для визначених користувачем типів. Ви повинні це здійснити. І іноді це просто нудно.