2009-07-22 5 views
15

ArrayList заявляет, что он реализует интерфейсы IList, ICollection и IEnumeralbe.Почему ArrayList реализует IList, ICollection, IEnumerable?

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

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

ответ

7

С помощью следующего кода:

interface I1 { } 
interface I2 : I1 { } 

class Foo: I2 { } 

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

class Foo: I2, I1 { } 

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

Также см Спешиал вопрос: Why collections classes in C# (like ArrayList) inherit from multiple interfaces if one of these interfaces inherits from the remaining?

-1
  1. IEnumerable - поддержать Foreach Заявление о
  2. ICollection - поддерживать добавить одну или несколько элемент в ArrayList
+0

спрашивающий не было спрашивая, для чего они были, спрашивал, почему они явно перечислены как реализуемые, когда они уже реализованы в силу наследования на IList –

13

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

Когда проверяется в Рефлектор, классы, которые в коде реализации IList имеют один и тот же интерфейс, как список объявлений классов, которые в коде объявляю, реализующих все Ilist, ICollection и IEnumerable.

1

Я не уверен, что 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 
Смежные вопросы