【发布时间】:2013-12-15 22:47:41
【问题描述】:
存在无法编写或查找的 Stream 派生类这一事实是否违反了 Liskov 替换原则?
例如,NetworkStream 无法查找,如果调用了方法Seek,则会抛出NotSupportedException。
还是因为CanSeek标志的存在就ok了?
考虑到众所周知的Square 继承自Rectangle 的示例... 将标志DoesHeightAffectsWidth 和DoesWidthAffectsHeight 添加到Rectangle 是否可以解决问题?
这不是为通过添加标志来修复问题打开了大门吗?
【问题讨论】:
-
我认为关于
IList<T>接口可以问同样的问题——大多数时候它只是被视为一个常规的、可变的索引集合,但它有IsReadOnly标志和Add可以抛出(最简单的例子:IList<int> intList = new int[3];)......不过还是很有趣的问题。 -
对。实际上我有这个问题是因为我正在阅读“数组与列表”的咆哮:)
-
@PatrykĆwiek:
ICollection<T>继承的ICollection<T>的IsReadOnly属性命名不佳,因为它指示对象是否可以添加或删除项目,而不是该项目是否“已读” -only”在任何更广泛的意义上。恕我直言,一个好的“列表”界面至少应该包括,(1)大小是不可变的吗? (2) 现有元素是不可变的吗? (3) 这个引用可以用来添加/删除项目吗? (4) 这个参考可以按索引写东西吗? (5) 这个引用是否可以安全地暴露给不应该修改集合的代码? (6) 它能接受所有U类型的东西吗?
标签: c# oop stream solid-principles liskov-substitution-principle