В .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>?