Reimplementare un'interfaccia che un'altra interfaccia eredita già
-
05-07-2019 - |
Domanda
Vedo molto cose del genere:
interface A { ... }
interface B : A { ... }
class C : B, A { ...}
Perché dovresti specificare che C implementa l'interfaccia A, quando B eredita già A? Fa qualche differenza semantica o è solo una questione di stile?
(Uno dei tanti esempi è List<T>
implementando IList<T>
e ICollection<T>
, mentre B
deriva anche da C
).
Aggiornamento: Grazie per aver confermato la mia ipotesi che non faccia alcuna differenza semantica.
Ho trovato una situazione correlata in cui non fa la differenza nel nominare esplicitamente un'interfaccia che è già nella struttura ereditaria:
Se A
fosse una classe, :
implementerebbe (ri) i membri dell'interfaccia da <=> solo se nominasse <=> in modo esplicito dopo "<=>".
[EDIT] Ho modificato il testo della domanda per evitare confusione con i membri dell'interfaccia esplicitamente implementati, che limitano l'uso del membro ai casi in cui l'oggetto viene trasmesso come interfaccia.
Soluzione
Credo che sia solo una questione di stile. È particolarmente importante quando si esaminano le classi framework / library - nel tuo esempio, ad esempio, evidenzia l'idea che questa classe può essere trattata come ICollection o IList, senza che lo sviluppatore debba sapere che IList è in realtà un ICollection.
Non ha ramificazioni funzionali. In particolare, questo codice verrebbe compilato o meno la classe "C" implementa esplicitamente "A":
namespace DotNetInterfaceTest {
class Program {
static void Main(string[] args) {
A c = new C();
}
}
interface A {
void foo();
}
interface B : A {
void bar();
}
class C : B {
public void bar() {}
public void foo() {}
}
}