В .NET 4.5/С# 5, IReadOnlyCollection<T>
объявлен с помощью свойства Count
:
public interface IReadOnlyCollection<out T> : IEnumerable<T>, IEnumerable
{
int Count { get; }
}
Мне интересно, не имеет смысла для ICollection<T>
реализовать интерфейс IReadOnlyCollection<T>
:
public interface ICollection<T> : IEnumerable<T>, IEnumerable, *IReadOnlyCollection<T>*
Это означало бы, что классы, реализующие ICollection<T>
, автоматически выполнили бы IReadOnlyCollection<T>
. Это звучит разумно для меня.
Абстракция ICollection<T>
может рассматриваться как расширение абстракции IReadOnlyCollection<T>
. Обратите внимание, что List<T>
, например, реализует как ICollection<T>
, так и IReadOnlyCollection<T>
.
Однако он не был разработан таким образом.
Что мне здесь не хватает? Почему вместо этого была выбрана текущая реализация?
UPDATE
Я ищу ответ, который использует аргументы Объектно-ориентированное проектирование, чтобы объяснить, почему:
- Конкретный класс, такой как
List<T>
, реализующий какIReadOnlyCollection<T>
, так иICollection<T>
- лучший дизайн, чем:
-
ICollection<T>
прямое выполнениеIReadOnlyCollection<T>
Также обратите внимание, что это по существу тот же вопрос, что и:
- Почему
IList<T>
не реализуетIReadOnlyList<T>
? - Почему
IDictionary<T>
не реализуетIReadOnlyDictionary<T>
?