Moștenirea multiplă

De la Wikipedia, enciclopedia liberă.
Salt la navigare Salt la căutare

Unele limbaje de programare vă permit să utilizați moștenire multiplă , în care o clasă poate moșteni funcționalitate și caracteristici de la mai multe clase de bază . Această tehnică contrastează cu moștenirea unică , unde o clasă poate moșteni dintr-o singură clasă de bază.

În programarea orientată obiect , moștenirea descrie o relație ierarhică între două clase, în care una (cea care moștenește) este numită „clasă derivată” (sau „clasă copil”, sau „subtip”), iar cealaltă (acea moștenire din) se numește „clasa părinte” (sau „clasa de bază” sau „superclasa”). Funcționalitățile moștenite de la „copil” permit obiectelor instanțiate pe acesta să împărtășească funcționalitățile „părintelui”, adică din clasa de bază.

De exemplu: să presupunem că ați creat o clasă:

Mammifero

echipat cu caracteristici precum mâncare, respirație, reproducere etc. . Putem defini o altă clasă:

Topo

care moștenește toate funcționalitățile Mammifero fără a fi nevoie să le redefinească, întrucât, fiind șoarecele un mamifer, împărtășește toate caracteristicile sale. La aceste caracteristici noua clasă adaugă altele, deținute de „șoareci” și care nu sunt comune tuturor mamiferelor, cum ar fi colectarea gunoiului . Pe lângă faptul că au caracteristicile comune tuturor mamiferelor, șoarecii împărtășesc alte caracteristici și funcționalități cu alte „clase” de obiecte, cum ar fi, de exemplu:

Personaggi di Ratatouille sau Vettori di malattie mortali

Deci, este foarte convenabil pentru clasa Topo - Topo , se poate moșteni , de asemenea , caracteristicile și funcționalitatea acestor clase, fără a fi nevoie să redefinească.

Problema diamantului

Diagrama „problemei diamantelor”

Moștenirea multiplă poate provoca o anumită confuzie în anumite contexte, atât de mult încât unii cred că dezavantajele depășesc beneficiile.

O posibilă cauză a ambiguității este următoarea: dacă două clase B și C moștenesc din clasa A și clasa D moștenesc atât din B, cât și din C, dacă o metodă din D apelează o metodă definită în A, din ce clasă moștenește?

Această ambiguitate se numește problema diamantului (în engleză diamond problem), datorită formei diagramei clasei de moștenire, similară cu un diamant.

Diferite limbaje de programare au rezolvat această problemă în moduri diferite.

Implementare în unele limbi

Java și .NET

Acest compromis a fost adoptat în Java: o clasă poate moșteni interfețe din mai multe clase de bază - adică expune aceleași metode ca interfețele clasei de bază către lumea exterioară - dar poate moșteni date și metode reale de la o singură clasa de bază. Limbajele platformei Microsoft .NET precum C # și Visual Basic folosesc, de asemenea , aceeași abordare.

Cu toate acestea, de la Java 8, au fost introduse modificatoare „implicite” care, atunci când sunt asociate cu metodele interfeței, permit (spre deosebire de metodele fără acest modificator) nu numai să declare, ci și să implementeze aceleași metode într-un mod diferit în interfețe. Cu toate acestea, este obligatoriu să înlocuiți metodele din subclasele care implementează ambele interfețe, dar printr-o instrucțiune bine definită puteți invoca o metodă precisă implementată a unei interfețe părinte specifice. Astfel, în cazul problemei diamantului, clasa D suprascrie metoda comună cu B și C definită în A și invocă metoda specifică a lui B sau C.

C ++

C ++ implicit urmează fiecare cale de moștenire separat, astfel încât obiectul D conține două obiecte separate ale lui A și utilizările membrilor A trebuie să fie calificate corespunzător. Dacă moștenirea de la A la B și moștenirea de la A la C sunt ambele marcate ca „virtuale” („clasa B: virtual A”), C ++ are grijă deosebită să creeze un singur obiect A, utilizarea membrilor A funcționează corect . Dacă moștenirea virtuală și moștenirea non-virtuală sunt amestecate, există doar un A virtual și unul A non-virtual pentru fiecare cale de moștenire non-virtuală către A.

Eiffel

În Eiffel, clasele derivate adaptează funcționalitatea moștenită prin redenumirea acestora sau prin definirea regulilor în prealabil pentru a rezolva ambiguitățile și pentru a decide ce versiune să aplice (versiunea moștenită sau clasa de bază).

REALbasic

Similar cu Java, REALbasic poate moșteni metode și date dintr-o singură clasă de bază și, în plus, există metode suplimentare pentru a „extinde” funcționalitatea unei clase fără a fi nevoie să recurgă la moștenire.

Perl

În Perl, clasele de la moștenire sunt aranjate într-o listă ordonată, iar prima metodă găsită în ierarhia de profunzime a primei clase din listă este apoi numită și așa mai departe pentru clasele ulterioare și clasele lor de bază respective.

Piton

Python acceptă o formă de moștenire multiplă, iar o metodă este apelată prin prima regulă profundă, de la stânga la dreapta. Prin urmare, dacă un atribut nu este găsit în clasa derivată, acesta este căutat în prima clasă de bază, apoi (recursiv) în clasele de bază ale acesteia din urmă și, numai dacă nu a fost găsit acolo, este căutat în a doua bază clasa clasei derivate și așa mai departe.


Exemplu

Iată un exemplu de moștenire multiplă în C ++ :

 clasa a
{
 protejat:
  int i;
 public:
  int get_i () {return i;}
  void set_i (int n) {i = n;}
};

clasa B
{
 protejat:
  int j;
 public:
  int get_j () {return j;}
  void set_j (int n) {j = n;}
};

clasa C: publicul A, publicul B
{
 protejat:
  int k;
 public:
  int get_k () {return k;}
  void set_k (int n) {k = n;}
};

În acest caz, C va moșteni atât de la A cât și de la B , și astfel va avea variabilele de instanță i și j și funcțiile get_i , set_i , get_j și set_j , precum și k și get_k și set_k .

Elemente conexe

linkuri externe

Informatică Portal IT : accesați intrările Wikipedia care se ocupă cu IT