2014-11-05 163 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

相關問題