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

7
我正在使用一个违反Liskov替换原则的API:它抛出扩展Exception的自己的Exception类型,但将基类的异常消息放在新的ErrorCode字段中,并将其自己(无用)的消息放在Message字段中。因此,要显示正确的消息,我需要将Exception强制转换为DerivedException类型并使用ErrorCode字段。如果我将其视为Exception对象,则会得到错误的消息。
现在,这让我感到不舒服,但很容易解决:我只需捕获DerivedException并按程序员的意图使用即可。因此,我的问题是:Liskov原则有什么大不了的?违反该原则的层次结构可能会遇到哪些实际问题?

1
那么抛出的异常不会包装原始异常,类似于:throw new DerivedEx("message", originalEx)?这很糟糕,这就是你需要强制转换的原因。请要求API的开发人员修复此问题。请要求他们阅读框架设计准则 - Steven
完全正确。我将询问他们,并预料到他们的反对,这实际上将是“那又怎样?” - Aidan
2个回答

8

一个实际的例子:

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

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


1

函数 F 需要一个类型为 T 的对象,你传递给它一个声称是有效的 T 的东西,但它的行为却不同;也就是说,有一些 T 所具有的属性,F 可能会依赖这些属性,但你的对象并不满足它们。会发生什么?几乎任何事情都可能发生。错误、失败、崩溃,甚至可能导致你的房子着火。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接