per quanto ne so, non ha veramente importa se dichiarato IList<T>
come:
public interface IList<T> : ICollection<T>, IEnumerable<T> { ... }
o semplicemente come:
public interface IList<T> : ICollection<T> { ... }
Ogni classe che vuole implementare IList<T>
dovrà implementare tutto di queste interfacce, cioè anche quelle ereditate.
Ovviamente, se avete implementato questa interfaccia senza implementare i metodi GetEnumerator
delle interfacce IEnumerable
/IEnumerable<T>
, otterreste un errore del compilatore; questa "dimostrazione" per dimostrazione dovrebbe essere sufficiente a dirti che "l'ereditarietà dell'interfaccia" è transitoria, anzi.
Sidenote 1. Su un lato nota (e un po 'off-topic), considera che si può anche effettuare le seguenti operazioni:
class Base
{
public void Foo() { ... }
}
interface IFoo
{
void Foo();
}
class Derived : Base, IFoo
{ }
Derived
in realtà non implementare IFoo
; la sua classe base Base
fornisce il metodo Foo
, ma non implementa esplicitamente lo IFoo
stesso.
Questo si compila bene, apparentemente perché ci sono tutti i metodi richiesti dalle interfacce. (Lascerò a questo e per il momento lascerò da parte i discorsi tecnici esatti.)
Il motivo per cui sto menzionando questo fenomeno apparentemente non correlato è che mi piace pensare all'ereditarietà dell'interfaccia in questo modo: è necessario implementare tutti i metodi richiesti dalle interfacce specificate nella dichiarazione della classe. Così, quando vedo
interface ICollection<T> : IEnumerable<T> { ... }
invece di dire, "ICollection<T>
eredita IEnumerable<T>
", potrei dire a me stesso, "ICollection<T>
richiede di tutte le classi di attuazione che implementano IEnumerable<T>
, anche."
Sidenote 2. Per concludere questa risposta con un altro aneddoto in qualche modo correlato (prometto che sarà l'ultimo):
Qualche tempo fa ho visto il video Inside .NET Rx and IObservable
/IObserver
in the BCL su Canale 9. Come potreste ora, quelle due nuove interfacce, in arrivo da Rx, sono stati introdotti nel BCL con .NET 4. Una cosa peculiare è che quando si iscrive un osservatore a un osservabile tramite observable.Subscribe(observer)
, tutto ciò che si ottiene è anonimo IDisposable
. Perché?
Come i chiacchieroni spiegano in quel video, avrebbero potuto dato il IDisposable
un nome più descrittivo (come ISubscription
), tramite un nome di tipo "alias", definito come segue:
interface ISubscription : IDisposable {}
Tuttavia, finalmente deciso contro questo. Hanno capito che una volta che un ISubscription
viene restituito dal metodo Subscribe
, non sarebbe più evidente che il valore restituito deve essere Dipose
d.
Quindi questo è un altro lato leggermente problematico dell '"eredità di interfaccia" che è opportuno tenere a mente.
si possono trovare alcune risposte in questo simile [domanda] [1] [1]: http://stackoverflow.com/questions/1164757/why-arraylist-implement-ilist-icollection-ienumerable – DesignFirst
http://stackoverflow.com/questions/4754923/a-question-about-interface-inheritance-in-net/4755044#4755044 – explorer
Questo è anche un duplicato di http://stackoverflow.com/questions/4817369/why -does-does-realy-list-implements-all-of-that-interfaces-not-just-ilistt/4818566 # 4818566 –