.NET 4.5 / C# 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>
。
ただし、そのように設計されていません。
ここで何が欠けていますか?代わりに現在の実装が選択されたのはなぜですか?
アップデート
オブジェクト指向設計の推論を使用して理由を説明する答えを探しています。
- と の両方を
List<T>
実装するなどの具象クラスIReadOnlyCollection<T>
ICollection<T>
以下よりも優れた設計です。
ICollection<T>
IReadOnlyCollection<T>
直接実装する
また、これは本質的に次の質問と同じであることに注意してください。
- なぜ
IList<T>
実装しないのIReadOnlyList<T>
ですか? - なぜ
IDictionary<T>
実装しないのIReadOnlyDictionary<T>
ですか?