IEnumerable интерфейс
-
10-07-2019 - |
Вопрос
Я не понимаю, почему IList
реализует IEnumerable
, учитывая, что IList
реализует ICollection
, который реализует < code> IEnumerable также.
Решение
Я предполагаю, что вы хотите знать, почему он объявляет, что он реализует ICollection
, а также IEnumerable
, когда первое подразумевает второе. Я подозреваю, что основной причиной является ясность: это означает, что людям не нужно оглядываться на ICollection
, чтобы проверить, что это уже расширяет IEnumerable
.
В других случаях вам необходимо переопределить реализацию интерфейса, если вы хотите повторно реализовать метод интерфейса, который ранее был явно реализован в базовом классе, - но я не думаю, что причина в этом случае. р>
РЕДАКТИРОВАТЬ: я предполагал, что исходный код, из которого построены документы, имеет объявление, включающее оба интерфейса. Другой возможной альтернативой является то, что все интерфейсы в иерархии автоматически извлекаются генератором документов. В этом случае возникает вопрос «почему генератор документов так делает»? - и ответ почти наверняка все еще "ясность".
Другие советы
IList
реализует IEnumerable
только по ассоциации; то есть он реализует IEnumerable
точно , потому что он наследует ICollection
, который является IEnumerable
. Вы получите то же самое с иерархиями типов (хотя только одно наследование:
class Enumerable {}
class Collection : Enumerable {}
class List : Collection {}
so List
является Enumerable
; точно так же IList
является IEnumerable
.
Например, если я напишу:
interface IA {}
interface IB : IA { }
interface IC : IB { }
И посмотрите на метаданные, тогда кажется, что IC: IA, IB
- но это только косвенно; вот ил:
.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
{
}
Если вы откроете код в ReSharper, это будет означать, что объявление интерфейса IEnumerable
в IList
не требуется, так как оно уже указано в ICollection код>.