繁体   English   中英

这是违反《利斯科夫换人原则》的行为吗?

[英]Is this a Liskov Substitution Principle violation?

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

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

这是子类型中前提的加强。 明显违反LSP。

按钮说:

只要启用该按钮,单击时就可以执行一些工作

ConditionalButton说:

只要启用了按钮并且Condition()为true ,单击时就可以执行一些工作

我认为这确实违反了LSP。 请参阅“ 对象导师”文章中“对象导师”的简化定义“ Liskov替代原理”:

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

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

为了使LSP保持并保持“开放-封闭”原则,所有派生类必须符合客户期望的使用它们的基类的行为。

并且可以肯定,客户希望单击按钮后将执行OnClick

此外,根据同一篇文章:

...在重新定义例程时(以派生方式),您只能将其先决条件替换为较弱的条件,而将其后置条件替换为更强的条件。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM