【发布时间】:2017-10-18 09:02:12
【问题描述】:
数组的ICollection<T>.Add()-实现是否违反了里氏替换原则?该方法导致NotSupportedException,它确实破坏了LSP,恕我直言。
string[] data = new string[] {"a"};
ICollection<string> dataCollection = data;
dataCollection.Add("b");
这会导致
未处理的异常:System.NotSupportedException: Collection was of 固定大小。
我发现了一个关于Stream-implementations 的非常相似的问题。我提出了一个单独的问题,因为这种情况非常不同:Liskov substitution principle and Streams。
这里的区别在于ICollection 不像Stream-class 那样提供CanAdd-Property 或类似的东西。
【问题讨论】:
-
类型不能单独违反 LSP,只有子类型不能用它们的超类型替代。
ICollection<T>.Add很丑,但它确实记录了如果IsReadOnly为假,NotSupportedException将被抛出。
标签: c# interface liskov-substitution-principle