Почему ArrayList реализует IList, ICollection, IEnumerable?

ArrayList объявляет, что он реализует интерфейсы IList, ICollection и IEnumeralbe.

Почему бы не реализовать только IList, потому что IList также выводится из ICollection, а ICollection - из IEnumerable.

Какова цель такого заявления? В .NET BCL существует много таких случаев.

Ответы

Ответ 1

Со следующим кодом:

interface I1 { }
interface I2 : I1 { }

class Foo: I2 { }

Если вы посмотрите на Foo через отражение, вы найдете

class Foo: I2, I1 { }

Что также справедливо для компиляции и дает тот же результат.
Таким образом, разница является спорным, и в документировании Foo вы можете также записать его с обоими интерфейсами.

Также см. вопрос SO: Почему классы коллекций в С# (например, ArrayList) наследуются от нескольких интерфейсов, если один из этих интерфейсов наследует от остальных?

Ответ 2

Нет эффективной разницы. Я считаю, что дополнительные декларации существуют для ясности.

При проверке в Reflector классы, которые в реализации кода IList имеют один и тот же список декларации интерфейса как классы, которые в коде объявляют реализацию всех IList, ICollection и IEnumerable.

Ответ 3

Я не уверен, что ArrayList имеет отдельные реализации интерфейсов. Рассмотрим следующий код:

public interface IBase
{
    int SomeInt { get; set; }
}

public interface ISub : IBase
{
    int SomeOther { get; set; }
}

public class MyClass : ISub
{
    public int SomeOther { get; set; }
    public int SomeInt { get; set; }
}

Тип MyClass реализует только интерфейс ISub. Однако, если вы скомпилируете код в сборку и затем добавите эту сборку в качестве ссылки в другой проект, откройте "Обозреватель объектов" и изучите базовые типы для MyClass, в нем будет что-то вроде этого:

Base Types
 |- ISub
 |    |- IBase
 |- IBase
 |- Object

Ответ 4

  • IEnumerable - для поддержки инструкции foreach
  • ICollection - поддержка добавления одного или нескольких элементов в arraylist