亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從矩形派生正方形是否違反了Liskov的替代原理?

從矩形派生正方形是否違反了Liskov的替代原理?

慕田峪4524236 2019-12-27 15:18:45
我是設計和學習設計原理的新手。它說從矩形派生正方形是違反Liskov替代原則的經典例子。如果是這樣,正確的設計應該是什么?
查看完整描述

3 回答

?
慕勒3428872

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都源自一個常見的“多邊形”或“形狀”類,該類不執行有關寬度或高度的任何規則。


查看完整回答
反對 回復 2019-12-27
?
白豬掌柜的

TA貢獻1893條經驗 獲得超10個贊

答案取決于可變性。如果矩形和正方形類是不可變的,那么Square它實際上是的子類型,Rectangle從第二個派生第一是完全可以的。否則,Rectangle而且Square可能都暴露一個IRectangle沒有改變者,但是從另一個派生一個是錯誤的,因為無論類型是正確其他的亞型。


查看完整回答
反對 回復 2019-12-27
  • 3 回答
  • 0 關注
  • 522 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號