Interface IEnumerable
-
10-07-2019 - |
Question
Je ne comprends pas pourquoi IList
implémente IEnumerable
en tenant compte du fait que IList
implémente ICollection
qui implémente < code> IEnumerable également.
La solution
Je suppose que vous voulez savoir pourquoi il déclare implémenter ICollection
ainsi que IEnumerable
, lorsque le premier implique le second. Je suppose que la raison principale en est la clarté: cela signifie que les utilisateurs n'ont pas besoin de revenir en arrière sur ICollection
pour vérifier que cela étend déjà IEnumerable
.
Il est parfois nécessaire de redéclarer une implémentation d'interface, si vous souhaitez réimplémenter une méthode d'interface qui était auparavant explicitement implémentée dans une classe de base - mais je ne pense pas que ce soit la raison dans ce cas.
EDIT: Je suppose que le code source à partir duquel les documents sont générés a la déclaration incluant les deux interfaces. Une autre alternative possible est que toutes toutes les interfaces de la hiérarchie soient automatiquement extraites par le générateur de doc. Dans ce cas, la question devient "Pourquoi le générateur de documentation le fait-il" - et la réponse est presque certainement toujours "clarté".
Autres conseils
IList
implémente uniquement IEnumerable
par associaton; c'est-à-dire qu'il implémente IEnumerable
précisément car il hérite de ICollection
qui est IEnumerable
. Vous obtiendriez la même chose avec les hiérarchies de types (bien qu’un seul héritage:
class Enumerable {}
class Collection : Enumerable {}
class List : Collection {}
so List
est un Enumerable
; De la même manière, IList
est IEnumerable
.
Par exemple, si j'écris:
interface IA {}
interface IB : IA { }
interface IC : IB { }
Et regardez les métadonnées, puis il apparaît que IC: IA, IB
- mais ce n’est qu’indirect; voici 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
{
}
Si vous deviez ouvrir le code dans ReSharper, cela indiquerait que la déclaration d'interface IEnumerable
sur IList
n'était pas requise, car elle est déjà spécifiée via ICollection
.