Interfaccia IEnumerable
-
10-07-2019 - |
Domanda
Non capisco perché IList
implementa IEnumerable
considerando che IList
implementa ICollection
che implementa < codice> IEnumerable anche.
Soluzione
Suppongo che tu voglia sapere perché dichiara di implementare ICollection
e IEnumerable
, quando il primo implica il secondo. Sospetto che il motivo principale sia la chiarezza: significa che le persone non hanno bisogno di guardare indietro a ICollection
per verificare che ciò estenda già IEnumerable
.
Ci sono altre volte in cui è necessario dichiarare nuovamente un'implementazione dell'interfaccia, se si desidera reimplementare un metodo di interfaccia che era stato precedentemente esplicitamente implementato in una classe base - ma non penso che sia la ragione in questo caso.
EDIT: suppongo che il codice sorgente da cui sono stati creati i documenti abbia la dichiarazione che include entrambe le interfacce. Un'altra possibile alternativa è che tutte le interfacce nella gerarchia vengano automaticamente inserite dal generatore di documenti. Nel qual caso la domanda diventa "perché il generatore di documenti lo fa" - e la risposta è quasi certamente ancora "chiarezza".
Altri suggerimenti
IList
implementa solo IEnumerable
per associazione; cioè implementa IEnumerable
precisamente perché eredita ICollection
che è IEnumerable
. Otterresti lo stesso con le gerarchie di tipi (anche se solo una singola eredità:
class Enumerable {}
class Collection : Enumerable {}
class List : Collection {}
quindi List
è un enumerabile
; allo stesso modo, IList
è IEnumerable
.
Ad esempio, se scrivo:
interface IA {}
interface IB : IA { }
interface IC : IB { }
E guarda i metadati, quindi sembra che IC: IA, IB
- ma questo è solo indiretto; ecco l'IL:
.class private interface abstract auto ansi IA
{
}
.class private interface abstract auto ansi IB
implements IA
{
}
.class private interface abstract auto ansi IC
implements IB, IA
{
}
Se dovessi aprire il codice in ReSharper, indicherebbe che la dichiarazione dell'interfaccia IEnumerable
su IList
non era richiesta, poiché è già specificata tramite ICollection
.