2014-11-05 58 views
0

我的自定义按钮实际上是一个按钮,它是违反LSP吗?这是违反Liskov替换原则吗?

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

我不认为它违反了LSP。但我敢打赌它违反了用户界面指南。如果'Condition()'为'False',则禁用该按钮以使其不能被按下。 – 2014-11-05 08:50:08

+0

@JackHughes我同意你的第二点(用户界面指南),并且不同意第一点,因为这显然违反了LSP。 – 2014-11-05 09:09:11

回答

2

在我看来,这确实违反LSP。请从Object Mentor文章指的里氏替换原则的对象导师简化定义:

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

从这个角度来看,这看起来没什么问题,因为我们可以使用ConditionalButton作为Button。但是:

为了使LSP持有,并与它的开闭原则,所有衍生 必须符合行为客户期望,他们使用

和基类的肯定客户期望点击一个按钮后,OnClick将被执行。

此外,从相同的文章:

...重新定义例程[以衍生物]时,则可以仅通过较弱的一个,并且其通过后置条件更强的一个替代其 前提。

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

+0

感谢您的链接,我认为这是最完整的答案。 – Flavius 2014-11-05 09:21:37

4

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

I.e.

巴顿说:

只要按钮被激活,在点击做了一些工作

ConditionalButton说:

只要按钮被启用和条件()为真,点击做一些工作

+2

+1所以,OP应该做些别的事情呢? – Jodrell 2014-11-05 09:10:42

+0

@Flavius我的回答都是关于LSP的? – weston 2014-11-05 09:29:08

+0

@Flavius“我不会忽略点击”那么你的代码呢。我无法评论你没有提供的代码。 – weston 2014-11-05 09:30:15

相关问题