Множествено наследяване
Множественото наследяванее свойство, поддържано от част от обектно-ориентираните езици за програмиране, когато един клас може да има повече от един суперклас (непосредствен родителски клас), интерфейсите поддържат множествено наследяване в много езици за програмиране. Тази концепция е разширение на „просто (или единично) наследяване“ (англ. single inheritance), при което един клас може да бъде наследен само от един суперклас.
Съдържание
Множественото наследяване позволява на класа да наследява функционалност от много други класове, например класът StudentMusician може да наследява от класа Person, класа Musician и класа Worker, което може да бъде написано накратко:
Неяснотата при множественото наследяване, както в примера по-горе, възниква, ако например класът Музикант наследява от класовете Човек и Работник, а класът Работник, на свой ред, наследява от Лице; тази ситуация се нарича наследство с форма на диамант. Така получаваме следните правила:
Ако компилаторът разглежда класа StudentMusician, тогава той трябва да знае дали характеристиките на класовете трябва да бъдат комбинирани или трябва да бъдат отделни. Например, би било логично да прикачите "Възраст" (възраст) на класа Person към класа StudentMusician. Възрастта на човек не се променя, ако го разглеждате като Лице (лице), Работник (работник) или Музикант (музикант). Въпреки това би било съвсем логично да се отдели свойството "Име" в класовете Person и Musician, ако те използват сценично име, което е различно от истинското им име. Опциите за присъединяване и разделяне са напълно валидни за всеки от техните собствени контексти и само програмистът знае коя опция е правилната за проектирания клас.
Езиците иматразлични начини за решаване на такива проблеми с вложеното наследяване, например:
Smalltalk, C#, Objective-C, Java, Nemerle и PHP не позволяват множествено наследяване, което избягва много неясноти. Въпреки това, те, в допълнение към Smalltalk, позволяват на класовете да реализират множество интерфейси. Освен това PHP и Ruby ви позволяват да емулирате множествено наследяване чрез използването на миксини (характеристики в PHP и миксини в Ruby), които, подобно на интерфейсите, не са пълноценни класове. Множественото наследяване на интерфейси ви позволява да разширите ограничените възможности.
Множественото наследяване е критикувано за следните проблеми в някои езици, по-специално C++:
- семантичната неяснота често се представя колективно катоПроблемът с диаманта[4] .
- няма възможност за директно множествено наследяване от един клас. [източникът не е посочен 3373 дни]
- редът на наследяване променя семантиката на класа. [източникът не е посочен 3373 дни] Конструкторът на дъщерния клас извиква конструкторите на непосредствените родители, които от своя страна извикват конструктора на баба и дядо. Обектът на баба и дядо обаче съществува в един екземпляр и не може да бъде конструиран два пъти, така че извикването на конструктора на баба и дядо само от конструктораот първияродителски клас в списъка с наследяване ще работи.
Множественото наследяване в езици с конструктори в стил C++/Java изостря проблема с наследяването на конструктора и последователността на конструктора, като по този начин създава проблеми с поддръжката и разширяемостта в тези езици. Обекти в наследствени отношения със значително различни методи на изграждане са доста трудни за изпълнение в рамките на парадигматапоследователности на конструктора.
Има обаче езици, които се справят с тези технически подробности (напр. Eiffel).
Има мнение, че множественото наследяване е грешна концепция, породена от грешен анализ и дизайн. По-специално, следната опция за дизайн е валидна за горния пример. Класът Person включва един или повече обекти от класа Profession. Класовете Студент и Музикант наследяват Професия. Така StudentMusician ще бъде представен от обект от клас Person, съдържащ обекти от клас Student и Musician. Формално, множественото наследяване може да бъде обратно проектирано чрез въвеждане на клас, който е "метаклас" на класовете, от които трябва да се появи множествено наследяване. В горния пример такъв метаклас е Profession - професия.