2009-10-05 51 views
2

如果我有像SOLID里氏替換原則

class square : figure {} 

class triangle : figure {} 

這是否意味着我永遠也不會用方形和三角形類,但只涉及數字呢?

從來沒有像這樣做:

var x = new square(); 

回答

6

在你的情況下,LSP將意味着所有的行爲從figure繼承應該是適合於squaretriangle。所以你不會想要figure.Side1,Side2Side3的setter,因爲那些對square沒有意義。

在某些時候,您必須參考squaretriangle,但只有在您正在做的事情是特定於子類的情況下。如果您正在實施適用於所有數字(可能是Draw方法)的行爲,那麼它應該接受figure參數,而不是squaretriangle

舉個例子,你的類可以被設置如下:

abstract class figure 
{ 
    abstract void draw(); 
} 

class triangle : figure 
{ 
    void draw() 
    { 
     // ... 
    } 
} 

class drawer 
{ 
    void call_draw(figure fig) 
    { 
     fig.draw(); 
    } 
} 

只要figure.draw()是虛擬的,這意味着它的實現可以(或必須)由子類重寫,可以執行triangle「即使該對象正被用作figure,也會出現這種情況。

+0

如果你不知道這是一個三角形,你將如何繪製三角形 – Omu 2009-10-06 05:28:38

+6

你讓它繪製自己。 – wds 2009-10-06 09:46:22

+2

而不是「繪圖」(它調用GDI的概念或棘手的事情)想想所有圖中都存在的GetArea()或GetPerimeter()。 非常關鍵的一點是Keith的第一段,他談到了Side1和Side1,這對Square沒有意義。或者考慮一個沒有雙方的圈子。如果圓從圖繼承。 var myCircle = new Circle(); myCircle.Side1 = xx; <====在現實世界中沒有任何意義 – user152800 2010-06-08 00:26:06

2

你必須定義squaretriangle類和實現他們的方法 - 你必須能夠建立他們,因爲你已經表明:

var x = new square(); 

大多數,如果不是的square所有其他的用途和triangle應該是通過基類figure.

至於LSP,這是指在其中採取figure作爲參數其他類的其它方法:

other_method(figure fig); 

這種方法應該是高興的工作,無論是在事實上squaretriangle實例被傳遞給它,它不應該嘗試發現爲了工作實際的類。