层次结构违反Liskov - 那又怎样?

时间:2011-08-04 08:06:07

标签: c# inheritance liskov-substitution-principle

我正在使用违反Liskov替换原则的API:它抛出自己的Exception类型,扩展Exception,但将基类中的异常消息放入新的ErrorCode字段中,并在Message中放入自己的(无用的)消息领域。因此,要显示正确的消息,我需要将Exception转换为DerivedException类型并使用ErrorCode字段。如果我把它当作Exception对象,我会得到错误的信息。

现在这让我感到风格化,但是它很容易解决:我可以捕获DerivedException并将其用作程序员的意图。所以我的问题是:利斯科夫原则有什么大不了的?使用违反原则的层次结构,人们可能会遇到哪些实际问题?

2 个答案:

答案 0 :(得分:8)

一个实际的例子:

如果你有一个方法LogException(Exception ex)的日志记录类,它将记录你认为无用的消息,而不是“真正的”消息。

日志方法的描述将从“记录异常消息”更改为“记录异常消息,但有时会记录无用消息”。

答案 1 :(得分:1)

函数F想要一个T类型的对象,你传递一些声称是有效T的东西,但行为不同;也就是说,有一些属性可以保存T,F可以依赖它,但是你的对象不满足它们。怎么会发生什么?几乎任何东西。错误,失败,崩溃,你的房子烧毁。