Se implemento un'interfaccia, si chiama un'eredità?

29

Se la mia classe implements un'interfaccia, allora posso dire che sto seguendo l'ereditarietà? Lo so che quando una classe extends un'altra classe allora è ereditaria.

    
posta RajeeV VenkaT 27.04.2016 - 10:24
fonte

3 risposte

75

AGGIORNAMENTO: ho rivisto questa risposta. Un certo numero di punti positivi sono stati sollevati nei commenti che meritavano di essere citati.

If my class implements an interface then can I say that I'm following inheritance?

Non è del tutto chiaro cosa intendi con "seguire l'eredità". Facciamo una domanda leggermente diversa?

What is inheritance?

  • Quando membri di un tipo X sono considerati membri di un altro tipo Y, quei membri di Y sono ereditati da X .
  • Esiste una relazione di ereditarietà tra alcuni tipi; cioè, per alcuni tipi X e Y diciamo "Y eredita da X".

Questi sono sottilmente diversi. Questo è un peccato perché è fonte di confusione.

What confusions typically arise from this subtle distinction?

Può sorgere confusione perché le persone pensano all'eredità come un meccanismo per condividere i dettagli di implementazione. Sebbene sia un tale meccanismo, quel meccanismo funziona condividendo membri . Questi membri non hanno bisogno di implementazioni! Come vedremo, possono essere astratti.

Personalmente sarei più felice se le specifiche Java e C # usassero una parola diversa da "eredita" per descrivere la relazione tra i metodi e le classi di interfaccia, per evitare questa confusione. Ma loro non lo fanno, e dobbiamo giustificare le specifiche, non contro loro.

In Java, are interface members inherited by classes which implement them?

Sì, alcuni lo sono. Vedi la sezione 8.4.8 della specifica Java, che cito qui per la tua convenienza.

A class C inherits from its direct superclass and direct superinterfaces all abstract and default methods m for which all of the following are true: [...]

Se dici che una classe implementa un'interfaccia, la classe eredita i metodi astratti e predefiniti di tale interfaccia . (Naturalmente ho omesso le condizioni seguenti: vedere le specifiche per i dettagli In particolare, una classe che implementa un membro di un'interfaccia è non considerata che abbia ereditato quel membro. ? Sì.)

Do we typically say in Java that a class inherits from an interface?

In genere, diciamo che una classe implementa un'interfaccia. Come notato sopra, una classe può ereditare membri da un'interfaccia, e tuttavia non è ancora detto che erediti dall'interfaccia. Che è confuso, sì.

Does this subtle distinction matter in day-to-day work?

Normalmente no. Questo tipo di analisi approfondita della specifica è più utile agli scrittori di compilatori che agli sviluppatori di business. È più importante capire quando utilizzare un'interfaccia piuttosto che ottenere una definizione precisa di "eredita da".

    
risposta data 27.04.2016 - 14:32
fonte
25

Eredità significa scrivere una nuova sottoclasse per una superclasse. Scrivere una nuova classe contro un'interfaccia è implementare quell'interfaccia. (E scrivere una nuova interfaccia basata su una vecchia è estendere quell'interfaccia.)

L'unico termine corretto che si applica a tutte e tre le possibilità è sottotipizzazione . Non tutti i sottotipi sono sottoclassi.

    
risposta data 27.04.2016 - 10:32
fonte
1

Con sottoclassi ,

  • stato ereditario della superclasse (tutte le variabili di istanza, che le vedi o meno)
  • eredita le implementazioni effettive (tutti i metodi non astratti)

Con le interfacce , completi il contratto implementando i metodi dichiarati.

Questo è il modo classico di guardarlo. Ora con Java 8 le interfacce diventano una miscela:

  • non si eredita ancora lo stato (poiché le interfacce non hanno ancora variabili di istanza)
  • ora puoi ereditare le implementazioni predefinite dall'interfaccia

Implementerebbe un'interfaccia i cui metodi hanno tutte implementazioni predefinite che valgono ancora come "implementare", o meglio come estensione? Non potrei dire. Dato che questo caso è piuttosto inverosimile (in realtà ha abilitato l'ereditarietà stateless), userei comunque l'ereditarietà solo con sottoclassi.

    
risposta data 27.04.2016 - 15:05
fonte

Leggi altre domande sui tag