Ereditarietà multipla (informatica)

Da Wikipedia, l'enciclopedia libera.

Alcuni linguaggi di programmazione permettono di utilizzare l' ereditarietà multipla, in cui una classe può ereditare funzionalità e caratteristiche da più di una classe base. Questa tecnica si contrappone all' ereditarietà singola, in cui una classe può ereditare da una, e solo una, classe base.

Nella programmazione orientata agli oggetti, l'ereditarietà descrive una relazione gerarchica fra due classi, nella quale una (quella che eredita) è chiamata "classe derivata" (o "classe figlia", o "sottotipo"), e l'altra (quella da cui si eredita) è chiamata "classe genitrice" (o "classe base"). Le funzionalità ereditate dalla "figlia" permettono agli oggetti istanziati su di essa di condividere le funzionalità della "genitrice", cioè della classe base.

Per esempio: supponiamo di aver creato una classe:

Mammifero

dotata di funzionalità come mangiare, respirare, riprodursi, ecc.. Possiamo definire un'altra classe:

Topo

che eredita tutte le funzionalità di Mammifero senza doverle ridefinire, in quanto, essendo il topo un mammifero, ne condivide tutte le caratteristiche. A queste funzionalità la nuova classe ne aggiunge altre, possedute dai "topi" e non comuni a tutti i mammiferi, come, ad esempio raccogliere spazzatura. Oltre che avere le caratteristiche comuni a tutti i mammiferi, tuttavia, i topi condividono altre caratteristiche e funzionalità con altre "classi" di oggetti, come, ad esempio:

Personaggi dei fumetti oppure Vettori di malattie

Quindi è molto comodo, per la classe Topo, poter ereditare anche le caratteristiche e le funzionalità di queste classi, senza doverle ridefinire.

Indice

[modifica] Inconvenienti

L'ereditarietà multipla può essere causa, in alcuni contesti, di qualche confusione, tanto che alcuni ritengono che gli inconvenienti siano maggiori dei benefici.

Una possibile causa di ambiguità è la seguente: se due classi base hanno ciascuna la propria implementazione indipendente dello stesso metodo o della stessa funzione, quale delle due è ereditata dalla classe derivata? (situazione nota come diamond problem)

[modifica] Implementazione in altri linguaggi

[modifica] Java e .NET

Per ovviare a questi inconvenienti, in Java si è adottato questo compromesso: una classe può ereditare le interfacce da più di una classe base - cioè esporre all'esterno gli stessi metodi delle interfacce delle classi base - ma può ereditare i dati ed i metodi effettivi da una sola classe base. Anche i linguaggi della piattaforma Microsoft .NET, come C# e Visual Basic utilizzano lo stesso approccio.

[modifica] Eiffel

In Eiffel le classi derivate adattano le funzionalità ereditate rinominandole o definendo anticipatamente le regole per risolvere le ambiguità e decidere quale versione applicare (quella ereditata o quella della classe base).

[modifica] REALbasic

Analogamente a Java anche in REALbasic si possono ereditare metodi e dati da una sola classe base, e, in più, sono previsti metodi aggiuntivi per "estendere" le funzionalità di una classe senza dover ricorrere all'ereditarietà.

[modifica] Perl

In Perl le classi da cui ereditare sono disposte in una lista ordinata, e viene poi chiamato il primo metodo trovato in ordine gerarchico di profondità della prima classe della lista, e così di seguito per le classi successive e per le loro rispettive classi base.


[modifica] Esempio

Ecco un esempio di ereditarietà multipla in C++:

class A
{
 protected:
  int i;
 public:
  int get_i() {return i;}
  void set_i(int n) {i=n;}
};

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

class C : public A, public B
{
 protected:
  int k;
 public:
  int get_k() {return k;}
  void set_k(int n) {k=n;}
};

In questo caso, C erediterà sia da A che da B, ed avrà quindi le variabili d'istanza i e j e le funzioni get_i, set_i, get_j e set_j, oltre che a k ed a get_k ed a set_k.

[modifica] Collegamenti esterni

[modifica] Voci correlate

Strumenti personali