在.NET 4.5 / C# 5中,使用Count
属性声明IReadOnlyCollection<T>
:
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>
发布于 2013-02-18 20:04:42
乔恩就在这里,https://stackoverflow.com/a/12622784/395144,你应该把他的回答标记为:
int ICollection<Foo>.Count { ... } // compiler error!
由于接口可以有显式实现,因此提取基本接口并不是向后兼容的(与基类不存在此问题)。
所以..。
Collection<T> : IReadOnlyCollection<T>
List<T> : IReadOnlyList<T>
Dictionary<TKey, TValue> : IReadOnlyDictionary<TKey, TValue>
..。但不是他们的接口。
IMHO,他们最初做了一个设计错误,现在很难解决(没有破坏)。
编辑:隐藏没有帮助,旧的(显式的)实现仍然不会构建(不修改代码):
interface INew<out T> { T Get(); }
interface IOld<T> : INew<T>
{
void Set(T value);
new T Get();
}
class Old<T> : IOld<T>
{
T IOld<T>.Get() { return default(T); }
void IOld<T>.Set(T value) { }
}
'Sample.Old‘不实现接口成员'Sample.INew.Get()’
发布于 2012-09-27 13:40:17
可能有几个原因。以下是一些:
ICollection<T>
的定义?这看起来很自然:
接口ICollection : IReadOnlyCollection { int计数{ get;}
但是它有一个问题,因为IReadOnlyCollection<T>
还声明了一个Count
属性(编译器将在这里发出警告)。除了警告之外,保留原样(相当于编写new int Count
)允许实现者至少显式地实现两个Count
属性的不同实现。如果这两个实现决定返回不同的值,这可能是“有趣的”。允许人们朝自己的脚开枪并不是C#的风格。
好吧,那么:
接口ICollection : IReadOnlyCollection { // Count是从IReadOnlyCollection }“继承”的
这破坏了所有决定显式实现Count
的现有代码:
类UnluckyClass : ICollection { int ICollection.Count {.} //编译器错误!}
因此,在我看来,这个问题没有很好的解决方案:要么破坏现有代码,要么强迫每个人都实现错误。所以唯一获胜的方法就是不玩。。发布于 2012-09-27 13:43:35
这在语义上是错误的,因为显然,并不是每个ICollection
都是只读的。
也就是说,他们可以调用接口IReadableCollection
,而实现可以称为ReadOnlyCollection
。
然而,他们没有走那条路。为什么?我看到了一个BCL团队成员写道,他们不希望集合API变得太复杂。(坦率地说,已经是了。)
https://stackoverflow.com/questions/12622539
复制相似问题