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

Проверьте дату стандарта ISO; вроде как это:

yyyy.MM.ddThh:mm

Это становится 2008.11.20T22:18.

15
задан River 19 October 2017 в 04:26
поделиться

4 ответа

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

interface I1 { }
interface I2 : I1 { }

class Foo: I2 { }

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

class Foo: I2, I1 { }

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

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

7
ответ дан 1 December 2019 в 03:43
поделиться

Эффективной разницы нет. Я считаю, что дополнительные объявления приведены для ясности.

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

13
ответ дан 1 December 2019 в 03:43
поделиться

Я не уверен, что 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
1
ответ дан 1 December 2019 в 03:43
поделиться
  1. IEnumerable - Для поддержки оператора foreach
  2. ICollection - Для поддержки добавления одного или нескольких элементов в arrayylist
-1
ответ дан 1 December 2019 в 03:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: