3 回答

TA貢獻1848條經驗 獲得超6個贊
我相信推理是這樣的:
假設您有一個接受矩形并調整其寬度的方法:
public void SetWidth(Rectangle rect, int width)
{
rect.Width = width;
}
給定一個矩形,假設此測試將通過將是完全合理的:
Rectangle rect = new Rectangle(50, 20); // width, height
SetWidth(rect, 100);
Assert.AreEqual(20, rect.Height);
...因為更改矩形的寬度不會影響其高度。
但是,假設您從Rectangle派生了一個新的Square類。根據定義,正方形的高度和寬度始終相等。讓我們再試一次該測試:
Rectangle rect = new Square(20); // both width and height
SetWidth(rect, 100);
Assert.AreEqual(20, rect.Height);
該測試將失敗,因為將正方形的寬度設置為100也會改變其高度。
因此,從矩形派生Square違反了Liskov的替換原理。
“是”規則在“現實世界”(正方形絕對是一種矩形)中很有意義,但在軟件設計領域并不總是這樣。
編輯
要回答您的問題,正確的設計可能應該是Rectangle和Square都源自一個常見的“多邊形”或“形狀”類,該類不執行有關寬度或高度的任何規則。

TA貢獻1893條經驗 獲得超10個贊
答案取決于可變性。如果矩形和正方形類是不可變的,那么Square
它實際上是的子類型,Rectangle
從第二個派生第一是完全可以的。否則,Rectangle
而且Square
可能都暴露一個IRectangle
沒有改變者,但是從另一個派生一個是錯誤的,因為無論類型是正確其他的亞型。
- 3 回答
- 0 關注
- 522 瀏覽
添加回答
舉報