IEnumerable интерфейс - PullRequest
       18

IEnumerable интерфейс

4 голосов
/ 12 января 2009

Я не понимаю, почему IList реализует IEnumerable, учитывая, что IList реализует ICollection, который также реализует IEnumerable.

Ответы [ 3 ]

11 голосов
/ 12 января 2009

Я предполагаю, что вы хотите знать, почему он объявляет, что он реализует ICollection, а также IEnumerable, когда первое подразумевает второе. Я подозреваю, что главная причина - ясность: это означает, что людям не нужно оглядываться на ICollection, чтобы проверить, что оно уже распространяется IEnumerable.

В других случаях вам необходимо переопределить реализацию интерфейса, если вы хотите повторно реализовать метод интерфейса, который ранее был явно реализован в базовом классе, - но я не думаю, что причина в этом случае.

РЕДАКТИРОВАТЬ: я предполагал, что исходный код, из которого построены документы, имеет объявление, включающее оба интерфейса. Другая возможная альтернатива состоит в том, что все интерфейсы в иерархии автоматически включаются генератором документов. В этом случае возникает вопрос «почему генератор документов так делает» - и ответ почти наверняка остается «ясным».

8 голосов
/ 12 января 2009

IList реализует только IEnumerable по ассоциации; то есть он реализует IEnumerable точно , потому что он наследует ICollection, то есть IEnumerable. Вы получите то же самое с иерархиями типов (хотя только одно наследование:

class Enumerable {}
class Collection : Enumerable {}
class List : Collection {}

поэтому 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
{
}
1 голос
/ 12 января 2009

Если вы откроете код в ReSharper, это будет означать, что объявление интерфейса IEnumerable для IList не требуется, так как оно уже указано в ICollection.

...