【问题标题】:Is this a Liskov Substitution Principle violation?这是否违反了 Liskov 替换原则?
【发布时间】:2015-01-01 09:18:22
【问题描述】:

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

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

【问题讨论】:

  • 我不认为它违反了 LSP。但我敢打赌,它违反了用户界面准则。如果Condition()False,则禁用该按钮使其无法按下。
  • @JackHughes 我同意你的第二点(用户界面指南)但不同意第一点,因为这显然违反了 LSP。

标签: c# oop solid-principles


【解决方案1】:

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

按钮说:

只要按钮被启用,点击做一些工作

条件按钮说:

只要按钮启用并且Condition()为真,点击做一些工作

【讨论】:

  • @Flavius 我的回答都是关于 LSP 的?!
  • @Flavius “我不会忽略点击” 你的代码可以。我无法评论您未提供的代码。
  • @weston 谢谢你的回答,无论如何你有我的支持。关于如何遵守用户界面指南存在一些误解。
【解决方案2】:

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

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

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

为了让 LSP 保持开闭原则,所有衍生品 必须符合客户期望他们使用的基类的行为

当然,客户希望在单击按钮后,OnClick 将被执行。

此外,来自同一篇文章:

...当重新定义一个例程[在派生中]时,您只能替换它的 一个较弱的前置条件和一个较强的后置条件。

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

【讨论】:

  • 感谢链接,我认为这是最完整的答案。
猜你喜欢
  • 2020-02-03
  • 2012-01-12
  • 1970-01-01
  • 1970-01-01
  • 2021-11-17
  • 1970-01-01
  • 1970-01-01
  • 2017-07-04
  • 2011-09-09
相关资源
最近更新 更多