Vícenásobná dědičnost

Vícenásobná dědičnost  je vlastnost podporovaná částí objektově orientovaných programovacích jazyků , kdy třída může mít více než jednu nadtřídu (přímá nadřazená třída), rozhraní podporují vícenásobnou dědičnost v mnoha programovacích jazycích. Tento koncept je rozšířením „jednoduché (neboli jediné) dědičnosti “ ( anglicky  single inheritance ), ve které třída může dědit pouze z jedné nadtřídy.

Mezi jazyky, které podporují vícenásobnou dědičnost, patří: Io , Eiffel , C++ , Dylan , Python , některé implementace tříd JavaScriptu (např. dojo .declare ), Perl 6 , Curl , Common Lisp (díky CLOS ), OCaml , Tcl (díky Incremental Tcl ) [1] , stejně jako Object REXX (kvůli použití tříd mixin ).

Přehled

Vícenásobná dědičnost umožňuje třídě dědit funkce z mnoha jiných tříd, například třída StudentMusicianmůže dědit z class Person, class Musiciana class Worker, které lze zkrátit jako:

StudentMusician : Person, Musician, Worker.

Nejistota při vícenásobné dědičnosti, jako ve výše uvedeném příkladu, nastane, pokud například třída Musiciandědí z tříd Persona Worker, a třída Workernaopak dědí z Person; podobná situace se nazývá dědičnost ve tvaru diamantu . Dostáváme tedy následující pravidla:

Dělník  : Osoba Hudebník  : Osoba, Dělník StudentHudebník  : Osoba, Hudebník, Dělník

Pokud se kompilátor dívá na třídu StudentMusician, pak potřebuje vědět, zda vlastnosti tříd mají být kombinovány nebo mají být odděleny. Například by bylo logické připojit „Věk“ (věk) třídy Osoba ke třídě StudentMusician. Věk osoby se nemění, pokud ji považujete za osobu (osobu), dělníka (dělníka) nebo hudebníka (hudebníka). Bylo by však zcela logické oddělit vlastnost „Jméno“ ve třídách Osoba a Hudebník, pokud používají umělecké jméno, které se liší od jejich skutečného jména. Možnosti spojení a rozdělení jsou dokonale platné pro každý z jejich vlastních kontextů a pouze programátor ví, která možnost je pro navrhovanou třídu správná.

Jazyky mají různé způsoby řešení takových vnořených problémů dědičnosti, například:

Smalltalk , C# , Objective-C , Java , Nemerle a PHP neumožňují vícenásobnou dědičnost, což zabraňuje mnoha nejistotám. Nicméně, kromě Smalltalku, umožňují třídám implementovat více rozhraní . PHP a Ruby navíc umožňují emulovat vícenásobnou dědičnost pomocí mixinů (vlastnosti v PHP a mixiny v Ruby), které stejně jako rozhraní nejsou plnohodnotnými třídami. Vícenásobná dědičnost rozhraní umožňuje rozšířit omezené možnosti.

Kritika

Vícenásobná dědičnost byla kritizována za následující problémy v některých jazycích, zejména C++:

Vícenásobná dědičnost v jazycích s konstruktory ve stylu C++/Java zhoršuje problém dědičnosti konstruktorů a sekvencí konstruktorů, čímž v těchto jazycích vytváří problémy s udržovatelností a rozšiřitelností. Objekty v dědičných vztazích s výrazně odlišnými konstrukčními metodami se v rámci paradigmatu konstruktorové sekvence poměrně obtížně implementují.

Existují však jazyky, které tyto technické záležitosti zvládají (např. Eiffel ).

Existuje názor, že vícenásobná dědičnost je nesprávný koncept, vytvořený nesprávnou analýzou a návrhem. Pro výše uvedený příklad platí zejména následující možnost návrhu. Třída Osoba zahrnuje jeden nebo více objektů třídy Profese. Třídy Student a Hudebník dědí z Profese. StudentMusician tedy bude reprezentován objektem třídy Osoba obsahující objekty třídy Student a Hudebník. Formálně lze vícenásobnou dědičnost provést zpětným inženýrstvím zavedením třídy, která je „metatřídou“ tříd, ze kterých má vícenásobná dědičnost nastat. Ve výše uvedeném příkladu je takovou metatřídou Profese – povolání.

Poznámky

  1. Advokacie Tcl . Získáno 2. prosince 2009. Archivováno z originálu 22. září 2010.
  2. David M. Beazley. Základní reference Pythonu . — 4. vydání. - Addison-Wesley Professional, 2009. - S.  119 -122. — 717 s. — ISBN 978-0672329784 .
  3. Manuál Tcl: třída . Získáno 2. prosince 2009. Archivováno z originálu dne 4. dubna 2009.
  4. Vlastnosti: Složitelné jednotky chování . Získáno 2. prosince 2009. Archivováno z originálu 9. srpna 2017.

Odkazy

Literatura