Почему 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