Мені завжди подобалася думка про підтримку декількох успадкованих мов. Найчастіше, хоча це навмисно пропало, і передбачувана "заміна" - це інтерфейси. Інтерфейси просто не охоплюють все одне й те саме багаторазове успадкування, і це обмеження час від часу може призвести до збільшення кодового коду.
Єдина основна причина, про яку я коли-небудь чув про це - проблема алмазів із базовими класами. Я просто не можу цього прийняти. Для мене це виходить дуже жахливо, як-от: "Ну, це можна викрутити, тому це автоматично погана ідея". Хоча ви можете накрутити що-небудь мовою програмування, і я маю на увазі все, що завгодно. Я просто не можу сприймати це серйозно, принаймні, не без більш ретельного пояснення.
Тільки усвідомлення цієї проблеми - це 90% битви. Крім того, я думаю, що я чув що-небудь років тому про загальні цілі роботи, що включають алгоритм "конверт" або щось подібне (чи цей дзвінок дзвонить, хтось?).
Щодо проблеми з алмазами, я можу придумати єдину потенційно справжню проблему, якщо ви намагаєтеся використовувати сторонні бібліотеки і не бачите, що два, здавалося б, не пов'язані між собою класи в цій бібліотеці мають загальний базовий клас, але на додаток до Документація, проста мовна функція може, скажімо, вимагати, щоб ви спеціально заявили про свій намір створити алмаз, перш ніж він фактично складе один для вас. З такою особливістю будь-яке створення алмазу є або навмисним, безрозсудним, або через те, що хтось не знає про цей підводний камінь.
Так що всі сказані ... Чи є якась реальна причина, що більшість людей ненавидять багаторазове спадкування, чи це все лише купа істерики, яка завдає більше шкоди, ніж користі? Чи є щось таке, чого я тут не бачу? Дякую.
Приклад
Автомобіль розширює WheeledVehicle, KIASpectra розширює Car and Electronic, KIASpectra містить радіо. Чому KIASpectra не містить електронних?
Тому що це Електронний. Спадкове відношення до складу завжди має бути співвідношенням "відносини" проти "відносини".
Тому що це Електронний. Є дроти, плати, вимикачі тощо, все це вгору і вниз.
Тому що це Електронний. Якщо акумулятор взимку загине, у вас виникають такі ж проблеми, як якщо б усі ваші колеса раптово зникли.
Чому б не використовувати інтерфейси? Візьмемо, наприклад, №3. Я не хочу писати це знову і знову, і я дійсно не хочу створювати якийсь химерний клас помічників проксі для цього:
private void runOrDont()
{
if (this.battery)
{
if (this.battery.working && this.switchedOn)
{
this.run();
return;
}
}
this.dontRun();
}
(Ми не вникаємо в те, добре чи погано це реалізація.) Ви можете уявити, як може бути кілька цих функцій, пов’язаних з Electronic, які не пов'язані ні з чим у WheeledVehicle, і навпаки.
Я не був впевнений, чи слід влаштовуватися на тому прикладі чи ні, оскільки тут є місце для інтерпретації. Ви також можете подумати з точки зору розширення літака транспортного засобу та FlyingObject та Bird Animal та FlyingObject або з точки зору набагато більш чистого прикладу.
Traits
- вони діють як інтерфейси з необов'язковою реалізацією, але мають деякі обмеження, які допомагають запобігти виникненню проблем, таких як алмазна проблема.
KiaSpectra
не є Electronic
; у нього є Електроніка, і може бути ElectronicCar
(що розшириться Car
...)