【发布时间】:2011-08-23 13:06:59
【问题描述】:
查看System.Array类的定义
public abstract class Array : IList, ...
理论上,我应该能写到这点,开心
int[] list = new int[] {};
IList iList = (IList)list;
我也应该能够从 iList 调用任何方法
ilist.Add(1); //exception here
我的问题不是为什么会出现异常,而是为什么 Array 实现 IList?
【问题讨论】:
-
好问题。我从不喜欢胖接口的想法(这是这种设计的技术术语)。
-
真的有人关心 LSP 吗?这对我来说似乎很学术。
-
@Gabe,那么您需要使用更大的代码库。实现一个行为(从接口继承)然后简单地忽略你不喜欢/不能支持的东西会导致臭味、混淆、强制转换,最后:错误代码。
-
@Gabe 它的集合意味着可变性而不是它包含的实体。您可以使您的类成员成为实现 IRWList 和 IReadList 的类型,在您的类内部使用 if 作为 IRWList 并将其公开为 IReadList。是的,你必须把复杂性放在某个地方,但我只是不明白这如何适用于无视 LSP 作为一个非常好的设计原则(虽然不知道 IsReadOnly 属性,但从消费者的角度来看这使得 IList 更加复杂)
标签: c# arrays ilist liskov-substitution-principle