3 回答

TA貢獻(xiàn)1848條經(jīng)驗(yàn) 獲得超6個(gè)贊
我相信推理是這樣的:
假設(shè)您有一個(gè)接受矩形并調(diào)整其寬度的方法:
public void SetWidth(Rectangle rect, int width)
{
rect.Width = width;
}
給定一個(gè)矩形,假設(shè)此測(cè)試將通過(guò)將是完全合理的:
Rectangle rect = new Rectangle(50, 20); // width, height
SetWidth(rect, 100);
Assert.AreEqual(20, rect.Height);
...因?yàn)楦木匦蔚膶挾炔粫?huì)影響其高度。
但是,假設(shè)您從Rectangle派生了一個(gè)新的Square類(lèi)。根據(jù)定義,正方形的高度和寬度始終相等。讓我們?cè)僭囈淮卧摐y(cè)試:
Rectangle rect = new Square(20); // both width and height
SetWidth(rect, 100);
Assert.AreEqual(20, rect.Height);
該測(cè)試將失敗,因?yàn)閷⒄叫蔚膶挾仍O(shè)置為100也會(huì)改變其高度。
因此,從矩形派生Square違反了Liskov的替換原理。
“是”規(guī)則在“現(xiàn)實(shí)世界”(正方形絕對(duì)是一種矩形)中很有意義,但在軟件設(shè)計(jì)領(lǐng)域并不總是這樣。
編輯
要回答您的問(wèn)題,正確的設(shè)計(jì)可能應(yīng)該是Rectangle和Square都源自一個(gè)常見(jiàn)的“多邊形”或“形狀”類(lèi),該類(lèi)不執(zhí)行有關(guān)寬度或高度的任何規(guī)則。

TA貢獻(xiàn)1893條經(jīng)驗(yàn) 獲得超10個(gè)贊
答案取決于可變性。如果矩形和正方形類(lèi)是不可變的,那么Square
它實(shí)際上是的子類(lèi)型,Rectangle
從第二個(gè)派生第一是完全可以的。否則,Rectangle
而且Square
可能都暴露一個(gè)IRectangle
沒(méi)有改變者,但是從另一個(gè)派生一個(gè)是錯(cuò)誤的,因?yàn)闊o(wú)論類(lèi)型是正確其他的亞型。
- 3 回答
- 0 關(guān)注
- 520 瀏覽
添加回答
舉報(bào)