2010-06-09 9 views

risposta

11

L'ereditarietà multipla delle classi concrete aumenta a variety of issues.

Ad esempio, cosa succede se una classe eredita due diverse implementazioni dello stesso metodo da due diverse classi di base?

Per evitare questi problemi, Java non supporta questa funzionalità.
A differenza delle classi concrete, le interfacce non possono avere corpi del metodo.

Pertanto, nessuno di questi problemi si applica alle interfacce.

+0

Perché è stato downvoted? – SLaks

+1

Vuoi aggiungere che questi problemi possono essere risolti (come in molti altri linguaggi), è solo che non ha molto senso farlo. –

0

Non mi piace il termine "ereditare" qui, causa molta confusione.

Java consente solo alle interfacce di estendere altre interfacce e alle classi di implementare interfacce.

Se si considera un'interfaccia come un insieme matematico di dichiarazioni, ciascuna "estensione" fornisce semplicemente l'unione dell'insieme dalla superinterfaccia e quella dell'interfaccia corrente. È quindi consentito fare più "sindacati".

Quando si arriva a una classe che implementa una o più interfacce, la semantica qui è semplicemente che la classe deve fornire implementazioni per tutti i metodi dell'insieme. Una classe che implementa più interfacce potrebbe essere riscritta come una classe che implementa una singola interfaccia che estende tutte le interfacce di cui sopra.

Nel caso di classi che ereditano più classi non è consentito perché porta a una serie di problemi, incluso il problema dei diamanti. Per esempio, se ho due supertipi con differenti implementazioni della stessa firma del metodo, quale dovrebbe essere usato nel sottotipo?

0

Per rendere il linguaggio più semplice ed elegante. Il C++ consente un sacco di cose, ma spesso è doloroso imparare e usare. Noi (io, almeno :)) non voglio che Java sia così.

1

Perché l'implementazione di un'interfaccia non è un'eredità. Significa semplicemente che la tua classe aderirà a un contratto predefinito, in genere per fornire una serie di metodi correlati a una determinata funzionalità. Qualsiasi classe può aderire a molti di questi contratti senza conflitti (a meno che due di queste interfacce definiscano lo stesso metodo).

A differenza dell'ereditarietà, non riceve automagicamente attributi o funzionalità a causa di una relazione gerarchica con la sua superclasse poiché non esiste tale relazione.

L'ereditarietà multipla non è fondamentalmente consentita in Java o in molti altri linguaggi OO a causa del già citato problema di Diamond Inheritance.

Problemi correlati