如果我有像SOLID里氏替換原則
class square : figure {}
class triangle : figure {}
這是否意味着我永遠也不會用方形和三角形類,但只涉及數字呢?
從來沒有像這樣做:
var x = new square();
如果我有像SOLID里氏替換原則
class square : figure {}
class triangle : figure {}
這是否意味着我永遠也不會用方形和三角形類,但只涉及數字呢?
從來沒有像這樣做:
var x = new square();
在你的情況下,LSP將意味着所有的行爲從figure
繼承應該是適合於square
或triangle
。所以你不會想要figure.Side1
,Side2
和Side3
的setter,因爲那些對square
沒有意義。
在某些時候,您必須參考square
或triangle
,但只有在您正在做的事情是特定於子類的情況下。如果您正在實施適用於所有數字(可能是Draw方法)的行爲,那麼它應該接受figure
參數,而不是square
或triangle
。
舉個例子,你的類可以被設置如下:
abstract class figure
{
abstract void draw();
}
class triangle : figure
{
void draw()
{
// ...
}
}
class drawer
{
void call_draw(figure fig)
{
fig.draw();
}
}
只要figure.draw()
是虛擬的,這意味着它的實現可以(或必須)由子類重寫,可以執行triangle
「即使該對象正被用作figure
,也會出現這種情況。
你必須定義square
和triangle
類和實現他們的方法 - 你必須能夠建立他們,因爲你已經表明:
var x = new square();
大多數,如果不是的square
所有其他的用途和triangle
應該是通過基類figure.
至於LSP,這是指在其中採取figure
作爲參數其他類的其它方法:
other_method(figure fig);
這種方法應該是高興的工作,無論是在事實上square
或triangle
實例被傳遞給它,它不應該嘗試發現爲了工作實際的類。
如果你不知道這是一個三角形,你將如何繪製三角形 – Omu 2009-10-06 05:28:38
你讓它繪製自己。 – wds 2009-10-06 09:46:22
而不是「繪圖」(它調用GDI的概念或棘手的事情)想想所有圖中都存在的GetArea()或GetPerimeter()。 非常關鍵的一點是Keith的第一段,他談到了Side1和Side1,這對Square沒有意義。或者考慮一個沒有雙方的圈子。如果圓從圖繼承。 var myCircle = new Circle(); myCircle.Side1 = xx; <====在現實世界中沒有任何意義 – user152800 2010-06-08 00:26:06