Moștenirea multiplă

Moștenirea multiplă  este o proprietate acceptată de o parte a limbajelor de programare orientate pe obiecte , când o clasă poate avea mai multe superclase (clasa părinte directă), interfețele acceptă moștenirea multiplă în multe limbaje de programare. Acest concept este o extensie a „moștenirii simple (sau unice) ” ( moștenire unică în engleză ), în care o clasă poate moșteni doar de la o superclasă.  

Limbile care acceptă moștenirea multiplă includ: Io , Eiffel , C++ , Dylan , Python , unele implementări de clasă JavaScript (de exemplu , dojo .declare ), Perl 6 , Curl , Common Lisp (mulțumită CLOS ), OCaml , Tcl (mulțumită Incremental ). Tcl ) [1] , precum și Object REXX (datorită utilizării claselor mixin ).

Prezentare generală

Moștenirea multiplă permite unei clase să moștenească funcționalitatea de la multe alte clase, cum ar fi o clasă StudentMusicianpoate moșteni de la class Person, class Musicianși class Worker, care pot fi abreviate ca:

StudentMusician : Person, Musician, Worker.

Incertitudinea în moștenirea multiplă, ca în exemplul de mai sus, apare dacă, de exemplu, o clasă Musicianmoștenește din clase Personși Worker, iar clasa Worker, la rândul său, moștenește din Person; o situație similară se numește moștenire în formă de diamant . Astfel, obținem următoarele reguli:

Muncitor  : Persoană Muzician  : Persoană, Muncitor StudentMusicician  : Persoană, Muzician, Muncitor

Dacă compilatorul se uită la clasa StudentMusician, atunci trebuie să știe dacă caracteristicile claselor ar trebui combinate sau ar trebui să fie separate. De exemplu, ar fi logic să atașăm „Vârsta” (vârsta) clasei Persoană la clasa StudentMusician. Vârsta unei persoane nu se schimbă dacă o considerați Persoană (persoană), Muncitor (lucrător) sau Muzician (muzician). Cu toate acestea, ar fi destul de logic să se separe proprietatea „Nume” în clasele Persoană și Muzician dacă folosesc un nume de scenă care este diferit de numele lor real. Opțiunile de unire și împărțire sunt perfect valabile pentru fiecare dintre propriile contexte și numai programatorul știe care opțiune este corectă pentru clasa proiectată.

Limbile au diferite moduri de a trata astfel de probleme de moștenire imbricate, de exemplu:

Smalltalk , C# , Objective-C , Java , Nemerle și PHP nu permit moștenirea multiplă, ceea ce evită multe incertitudini. Cu toate acestea, ele, pe lângă Smalltalk, permit claselor să implementeze mai multe interfețe . În plus, PHP și Ruby vă permit să emulați moștenirea multiplă prin utilizarea mixin-urilor (trăsături în PHP și mixin în Ruby), care, ca și interfețele, nu sunt clase cu drepturi depline. Moștenirea multiplă a interfețelor vă permite să extindeți capabilități limitate.

Critica

Moștenirea multiplă a fost criticată pentru următoarele probleme în unele limbi, în special C++:

Moștenirea multiplă în limbaje cu constructori în stil C++/Java exacerba problema moștenirii constructorului și a secvențelor constructoarelor, creând astfel probleme de mentenanță și extensibilitate în acele limbi. Obiectele aflate în relații de moștenire cu metode de construcție semnificativ diferite sunt destul de greu de implementat în paradigma secvenței constructorului.

Cu toate acestea, există limbi care se ocupă de aceste aspecte tehnice (de exemplu, Eiffel ).

Există o părere că moștenirea multiplă este un concept greșit, generat de o analiză și design greșit. În special, următoarea opțiune de proiectare este valabilă pentru exemplul de mai sus. Clasa Persoană include unul sau mai multe obiecte din clasa Profesie. Clasele Studenți și Muzician moștenesc din Profesie. Astfel, StudentMusician va fi reprezentat de un obiect din clasa Persoana care contine obiecte din clasa Student si Muzician. În mod formal, moștenirea multiplă poate fi inginerie inversă prin introducerea unei clase care este o „metaclasă” a claselor din care urmează să aibă loc moștenirea multiplă. În exemplul de mai sus, o astfel de metaclasă este Profession - o profesie.

Note

  1. Tcl Advocacy . Consultat la 2 decembrie 2009. Arhivat din original pe 22 septembrie 2010.
  2. David M. Beazley. Referință esențială Python . — ediția a IV-a. - Addison-Wesley Professional, 2009. - S.  119 -122. — 717 p. — ISBN 978-0672329784 .
  3. Tcl Manual: clasa . Consultat la 2 decembrie 2009. Arhivat din original la 4 aprilie 2009.
  4. Trăsături: Unități de Comportament Composable . Preluat la 2 decembrie 2009. Arhivat din original la 9 august 2017.

Link -uri

Literatură