这是Liskov替换原则违规吗?

时间:2014-11-05 08:45:04

标签: c# oop solid-principles

我的自定义按钮实际上是一个按钮,它是否违反了LSP?

class ConditionalButton : Button
{
    protected override void OnClick(EventArgs e)
    {
        if (Condition())
            base.OnClick(e);
    }
    private bool Condition()
    {
        //return true or false
    }
}

2 个答案:

答案 0 :(得分:5)

这是加强子类型的先决条件。明显违反LSP。

按钮说:

  

只要启用该按钮,点击即可完成一些工作

ConditionalButton说:

  

只要按钮启用且条件()为真,点击即可完成工作

答案 1 :(得分:2)

在我看来,确实违反了LSP。请参阅Object Mentor文章中的对象导师简化的Liskov替换原则定义:

  

“使用指针或对基类的引用的函数必须能够使用派生类的对象而不知道它。”

从这个角度来看,我们可以将ConditionalButton用作Button,这似乎没问题。但是:

  

为了使LSP保持开放 - 封闭原则,以及所有衍生物   必须符合客户对其使用的基类所期望的行为

并且确定客户希望在点击按钮后,OnClick将被执行。

此外,来自同一篇文章:

  

...当重新定义[衍生]中的例程时,您只能替换它   较弱者的前提条件,较强者的后置条件。

在我看来,ConditionalButton以当前形式违反LSP,因为Condition允许单击按钮,而与按钮相关的逻辑将不会被执行。如果Condition与启用/禁用标志相关 - 它不会违反LSP。

相关问题