也談"正方形不是長方形"
阿新 • • 發佈:2019-02-13
有關正方形不是長方形的討論已經有很多了,這也是面向物件的分析與設計中,特別是類的設計中的一個很經典問題,一般相關教科書中都有這個例子。不過很多初學者基本上都很迷糊。主要是教科書講得太專業,太深奧了。個人認為可以從下面兩方面來簡單理解。
首先看看長方形和正方形的特點:
1、長方形:
A、 屬性:長,寬
B、方法:
求面積=長*寬 求周長=(長+寬)*2
2、正方形:
A、屬性:邊長 [或者 長=寬]
B、方法:
求面積=邊長的平方 [或者 長*寬] 求周長=邊長*4 [或者 (長+寬)*2]
有了上面的對比以後,可以這樣認識它們:
其一,絕對來看,長方形與正方形本來就不是同類,當然正方形更不是長方形的子類,為什麼這麼說呢,因為它們從屬性到方法,都有很大的差別,長方形具有兩個屬性,長與寬,而正方形卻只有一個屬性,邊長。並且兩者方法的表述也可以完全不同。互相之間看不到繼承,包含,或者從屬關係。根本就是獨立的兩個不同的類。
其二,相對來看,正方形就是長方形了,具有長方形的所有特點,具體的正方形表現為,兩個欄位值相等的長方形類的例項。所以從這個角度,可以認為,長方形沒有多型,不存在正方形這樣的子類。
有了這兩種認識,在具體解決問題的時候,就比較簡單了。在類的設計的時候有兩種思路,第一種,可以分別設計長方形,正方形兩個類,井水不犯河水。第二種,只需要設計一個長方形類就行了。
個人理解,僅供批評。