Множи́нна спадко́вість — властивість деяких обʼєктно-орієнтованих мов програмування, в яких класи можуть успадкувати поведінку і властивості більш ніж від одного суперкласу (безпосереднього батьківського класу). Це відрізняється від простого спадкування, у випадку якого клас може мати тільки один суперклас.
Мови програмування з підтримкою множинного спадкування: Eiffel, , Dylan, Python, Perl, Curl, Common Lisp (завдяки CLOS), OCaml, Tcl (завдяки ) та (завдяки використанню класів домішок).
Огляд
Множинне спадкування дозволяє класу успадковувати функціональність від декількох інших класів, оскільки дозволяє класу StreetMusician
успадковуватись від класів Human
, Musician
, Worker
. Це можна скоротити як StreetMusician : Human, Musician, Worker
. При множинному спадкуванні в попередньому прикладі може виникнути невизначеність, якщо, наприклад, клас Musician
походить від Human
і Worker
, а клас Worker
також походить від Human
. В такому випадку кажуть про присутність ромбоподібного спадкування. Таким чином отримуємо:
Worker : Human Musician : Human, Worker StreetMusician : Human, Musician, Worker
Якщо компілятор переглядає клас StreetMusician, йому необхідно знати, коли об'єднувати однакові властивості, а коли тримати їх окремо. Наприклад, має сенс об'єднати властивості Age класу Human в StreetMusician. Вік людини не змінюється незалежно від того, чи ми розглядаємо її як музиканта, працівника або як людину загалом. З іншого боку, ім'я може бути як сценічним псевдонімом, так і справжнім ім'ям. Вибір об'єднати або відокремити покладається на програміста, який має знати, що саме є правильним при розробці певного класу.
Різні мови обробляють повторюване успадкування різними шляхами.
- Eiffel дозволяє програмісту явно об'єднати або розділити властивості успадковані від суперкласів. Eiffel автоматично об'єднує властивості, якщо вони мають однакові імена та реалізації. Програміст має змогу перейменувати успадковані властивості, щоб розділити їх. Eiffel також дозволяє явне повторюване спадкування, таке як A: B, B.
- вимагає явної вказівки, з якого батьківського класу треба використати дану властивість, тобто "Worker::Human.Age". C++ на відміну від Eiffel не дозволяє явного повторюваного спадкування через відсутність можливості вказати, який з суперкласів треба використовувати. C++ підтримує можливість уникнення неоднозначності через створення єдиного екземпляра батьківського класу через використання механізму віртуальної спадковості (тобто "Worker::Human" і "Musician::Human" будуть вказувати на один і той самий об'єкт).
- Perl використовує список класів для спадкування як впорядкований список. Компілятор використовує метод знайденим першим за допомогою пошуку в глибину серед списку суперкласів або C3 лінеаризації ієрархії класів. Різні розширення забезпечують альтернативні побудови. Python має таку саму структуру, але, на відміну від Perl, містить це як частину синтаксису самої мови. В Perl і Python на семантику класу впливає порядок спадкування.
Smalltalk, C#, Objective-C, Object Pascal, Java, Nemerle, та PHP не підтримують множинної спадковості реалізації, і це дозволяє уникнути будь-якої неоднозначності. Однак всі вони, крім Smalltalk, надають класам можливість реалізувати декілька інтерфейсів.
Перевіркою на необхідність множинного спадкування може стати ситуація, коли після побудови структури класів кінцеві класи (листя) можна згрупувати в набори за різними ортогональними ознаками і ці набори між собою перетинаються, що може слугувати ознакою неможливості обійтися однією структурою спадкування, в якій існували б якісь проміжні класи з потрібною поведінкою.
Алмазна проблема
![image](https://www.wikidata.uk-ua.nina.az/image/aHR0cHM6Ly93d3cud2lraWRhdGEudWstdWEubmluYS5hei9pbWFnZS9hSFIwY0hNNkx5OTFjR3h2WVdRdWQybHJhVzFsWkdsaExtOXlaeTkzYVd0cGNHVmthV0V2WTI5dGJXOXVjeTkwYUhWdFlpODRMemhsTDBScFlXMXZibVJmYVc1b1pYSnBkR0Z1WTJVdWMzWm5Mekl5TUhCNExVUnBZVzF2Ym1SZmFXNW9aWEpwZEdGdVkyVXVjM1puTG5CdVp3PT0ucG5n.png)
«Алмазна проблема» (англ. diamond problem) (інколи згадувана як «Смертоносний діамант смерті») це неоднозначність, яка виникає, коли два класи B і C успадковуються від A, а клас D успадковується від обох B і C. Якщо в A є метод, який B і C перевизначили, а D не замістив його, тоді яку версію методу успадковує D: метод B чи метод C?
Наприклад, у контексті розробки програмного забезпечення для GUI, клас Button
може успадкуватися від обох класів Rectangle
(для зовнішнього вигляду) і Clickable
(для функціональності/обробляння введення), а класи Rectangle
і Clickable
обидва успадковуються від класу Object
. Тепер, якщо метод equals
викликається для об'єкта Button
, і такого методу немає в класі Button
, але є заміщення методу equals
у Rectangle
або Clickable
(або в обох), який метод слід викликати?
Це явище називають «алмазною проблемою» через форму діаграми успадкування класів у цій ситуації. У цьому випадку клас A знаходиться вгорі, B і C окремо під ним, а D об’єднує обидва внизу, утворюючи форму ромба.
Примітки
- . Архів оригіналу за 22 вересня 2010. Процитовано 13 вересня 2010.
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Mnozhi nna spadko vist vlastivist deyakih obʼyektno oriyentovanih mov programuvannya v yakih klasi mozhut uspadkuvati povedinku i vlastivosti bilsh nizh vid odnogo superklasu bezposerednogo batkivskogo klasu Ce vidriznyayetsya vid prostogo spadkuvannya u vipadku yakogo klas mozhe mati tilki odin superklas Movi programuvannya z pidtrimkoyu mnozhinnogo spadkuvannya Eiffel C Dylan Python Perl Curl Common Lisp zavdyaki CLOS OCaml Tcl zavdyaki ta zavdyaki vikoristannyu klasiv domishok OglyadMnozhinne spadkuvannya dozvolyaye klasu uspadkovuvati funkcionalnist vid dekilkoh inshih klasiv oskilki dozvolyaye klasu StreetMusician uspadkovuvatis vid klasiv Human Musician Worker Ce mozhna skorotiti yak StreetMusician Human Musician Worker Pri mnozhinnomu spadkuvanni v poperednomu prikladi mozhe viniknuti neviznachenist yaksho napriklad klas Musician pohodit vid Human i Worker a klas Worker takozh pohodit vid Human V takomu vipadku kazhut pro prisutnist rombopodibnogo spadkuvannya Takim chinom otrimuyemo Worker Human Musician Human Worker StreetMusician Human Musician Worker Yaksho kompilyator pereglyadaye klas StreetMusician jomu neobhidno znati koli ob yednuvati odnakovi vlastivosti a koli trimati yih okremo Napriklad maye sens ob yednati vlastivosti Age klasu Human v StreetMusician Vik lyudini ne zminyuyetsya nezalezhno vid togo chi mi rozglyadayemo yiyi yak muzikanta pracivnika abo yak lyudinu zagalom Z inshogo boku im ya mozhe buti yak scenichnim psevdonimom tak i spravzhnim im yam Vibir ob yednati abo vidokremiti pokladayetsya na programista yakij maye znati sho same ye pravilnim pri rozrobci pevnogo klasu Rizni movi obroblyayut povtoryuvane uspadkuvannya riznimi shlyahami Eiffel dozvolyaye programistu yavno ob yednati abo rozdiliti vlastivosti uspadkovani vid superklasiv Eiffel avtomatichno ob yednuye vlastivosti yaksho voni mayut odnakovi imena ta realizaciyi Programist maye zmogu perejmenuvati uspadkovani vlastivosti shob rozdiliti yih Eiffel takozh dozvolyaye yavne povtoryuvane spadkuvannya take yak A B B C vimagaye yavnoyi vkazivki z yakogo batkivskogo klasu treba vikoristati danu vlastivist tobto Worker Human Age C na vidminu vid Eiffel ne dozvolyaye yavnogo povtoryuvanogo spadkuvannya cherez vidsutnist mozhlivosti vkazati yakij z superklasiv treba vikoristovuvati C pidtrimuye mozhlivist uniknennya neodnoznachnosti cherez stvorennya yedinogo ekzemplyara batkivskogo klasu cherez vikoristannya mehanizmu virtualnoyi spadkovosti tobto Worker Human i Musician Human budut vkazuvati na odin i toj samij ob yekt Perl vikoristovuye spisok klasiv dlya spadkuvannya yak vporyadkovanij spisok Kompilyator vikoristovuye metod znajdenim pershim za dopomogoyu poshuku v glibinu sered spisku superklasiv abo C3 linearizaciyi iyerarhiyi klasiv Rizni rozshirennya zabezpechuyut alternativni pobudovi Python maye taku samu strukturu ale na vidminu vid Perl mistit ce yak chastinu sintaksisu samoyi movi V Perl i Python na semantiku klasu vplivaye poryadok spadkuvannya Smalltalk C Objective C Object Pascal Java Nemerle ta PHP ne pidtrimuyut mnozhinnoyi spadkovosti realizaciyi i ce dozvolyaye uniknuti bud yakoyi neodnoznachnosti Odnak vsi voni krim Smalltalk nadayut klasam mozhlivist realizuvati dekilka interfejsiv Perevirkoyu na neobhidnist mnozhinnogo spadkuvannya mozhe stati situaciya koli pislya pobudovi strukturi klasiv kincevi klasi listya mozhna zgrupuvati v nabori za riznimi ortogonalnimi oznakami i ci nabori mizh soboyu peretinayutsya sho mozhe sluguvati oznakoyu nemozhlivosti obijtisya odniyeyu strukturoyu spadkuvannya v yakij isnuvali b yakis promizhni klasi z potribnoyu povedinkoyu Almazna problemaDiagrama rombopodibnogo uspadkuvannya Almazna problema angl diamond problem inkoli zgaduvana yak Smertonosnij diamant smerti ce neodnoznachnist yaka vinikaye koli dva klasi B i C uspadkovuyutsya vid A a klas D uspadkovuyetsya vid oboh B i C Yaksho v A ye metod yakij B i C pereviznachili a D ne zamistiv jogo todi yaku versiyu metodu uspadkovuye D metod B chi metod C Napriklad u konteksti rozrobki programnogo zabezpechennya dlya GUI klas Button mozhe uspadkuvatisya vid oboh klasiv Rectangle dlya zovnishnogo viglyadu i Clickable dlya funkcionalnosti obroblyannya vvedennya a klasi Rectangle i Clickable obidva uspadkovuyutsya vid klasu Object Teper yaksho metod equals viklikayetsya dlya ob yekta Button i takogo metodu nemaye v klasi Button ale ye zamishennya metodu equals u Rectangle abo Clickable abo v oboh yakij metod slid viklikati Ce yavishe nazivayut almaznoyu problemoyu cherez formu diagrami uspadkuvannya klasiv u cij situaciyi U comu vipadku klas A znahoditsya vgori B i C okremo pid nim a D ob yednuye obidva vnizu utvoryuyuchi formu romba Primitki Arhiv originalu za 22 veresnya 2010 Procitovano 13 veresnya 2010