我的自定义按钮实际上是一个按钮,它是否违反了LSP?
class ConditionalButton : Button
{
protected override void OnClick(EventArgs e)
{
if (Condition())
base.OnClick(e);
}
private bool Condition()
{
//return true or false
}
}
答案 0 :(得分:5)
这是加强子类型的先决条件。明显违反LSP。
即
按钮说:
只要启用该按钮,点击即可完成一些工作
ConditionalButton说:
只要按钮启用且条件()为真,点击即可完成工作
答案 1 :(得分:2)
在我看来,确实违反了LSP。请参阅Object Mentor文章中的对象导师简化的Liskov替换原则定义:
“使用指针或对基类的引用的函数必须能够使用派生类的对象而不知道它。”
从这个角度来看,我们可以将ConditionalButton
用作Button
,这似乎没问题。但是:
为了使LSP保持开放 - 封闭原则,以及所有衍生物 必须符合客户对其使用的基类所期望的行为
并且确定客户希望在点击按钮后,OnClick
将被执行。
此外,来自同一篇文章:
...当重新定义[衍生]中的例程时,您只能替换它 较弱者的前提条件,较强者的后置条件。
在我看来,ConditionalButton
以当前形式违反LSP,因为Condition
允许单击按钮,而与按钮相关的逻辑将不会被执行。如果Condition
与启用/禁用标志相关 - 它不会违反LSP。