Se la mia classe è implements
un'interfaccia, allora posso dire che sto seguendo l'eredità? So che quando una classe è extends
un'altra, allora è eredità.
Se la mia classe è implements
un'interfaccia, allora posso dire che sto seguendo l'eredità? So che quando una classe è extends
un'altra, allora è eredità.
Risposte:
AGGIORNAMENTO: ho rivisto questa risposta. Numerosi punti positivi sono stati sollevati nei commenti che meritavano di essere richiamati.
Se la mia classe implementa un'interfaccia, allora posso dire che sto seguendo l'eredità?
Non è del tutto chiaro cosa intendi per "seguire l'eredità". Facciamo una domanda leggermente diversa?
Che cos'è l'eredità?
Questi sono leggermente diversi. Questo è un peccato perché è confuso.
Quali confusioni derivano tipicamente da questa sottile distinzione?
La confusione può sorgere perché le persone pensano all'eredità come un meccanismo per condividere i dettagli dell'implementazione. Anche se è un tale meccanismo, che meccanismo funziona attraverso la condivisione di membri . Quei membri non devono avere 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 metodi di interfaccia e classi, per evitare questa confusione. Ma non lo fanno, e dobbiamo ragionare dalle specifiche, non contro di loro.
In Java, i membri dell'interfaccia sono ereditati dalle classi che li implementano?
Sì, alcuni lo sono. Vedere la sezione delle specifiche Java 8.4.8, che cito qui per comodità.
Una classe C eredita dalla sua superclasse diretta e dalle superinterfacce dirette tutti i metodi astratti e predefiniti m per i quali sono vere tutte le seguenti condizioni: [...]
Se dici che una classe implementa un'interfaccia, la classe eredita i metodi astratti e predefiniti di tale interfaccia . (Naturalmente ho omesso le condizioni che seguono; vedere le specifiche per i dettagli. In particolare, una classe che implementa un membro di un'interfaccia non è considerata ereditata da quel membro. Ancora una volta, è confuso? Sì.)
Generalmente in Java diciamo che una classe eredita da un'interfaccia?
In genere si direbbe che una classe implementa un'interfaccia. Come notato sopra, una classe può ereditare i membri da un'interfaccia e tuttavia non si può dire che erediti dall'interfaccia. Il che è confuso, sì.
Questa sottile distinzione è importante nel lavoro quotidiano?
In genere no. Questo tipo di analisi ristretta delle specifiche è più utile per gli autori di compilatori che per gli sviluppatori della linea di business. È più importante capire quando utilizzare un'interfaccia piuttosto che ottenere una definizione precisa di "eredita da".
java
quindi questa è la risposta giusta, a meno che OP non abbia significato qualcos'altro java
:-)
Ereditarietà significa scrivere una nuova sottoclasse per una superclasse. Scrivere una nuova classe su un'interfaccia significa implementare quell'interfaccia. (E scrivere una nuova interfaccia basata su una vecchia sta estendendo tale interfaccia.)
L'unico termine corretto che si applica a tutte e tre le possibilità è il sottotipo . Non ogni sottotipo è una sottoclasse.
Con le sottoclassi , tu
Con le interfacce , si completa un contratto implementando i metodi dichiarati.
Questo è il modo classico di vederlo. Ora con Java 8 le interfacce diventano una miscela:
L'implementazione di un'interfaccia i cui metodi hanno tutte implementazioni predefinite continuerebbe a essere considerata come "implement", o piuttosto come estensione? Non saprei dirlo. Dato che questo caso è piuttosto inverosimile (questo abilitava la multi-ereditarietà senza stato), userei comunque l'ereditarietà solo con le sottoclassi.