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.
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.
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?
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".
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.
Con sottoclassi ,
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:
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.
Leggi altre domande sui tag java interfaces inheritance terminology definition