1. 程式人生 > >也談"正方形不是長方形"

也談"正方形不是長方形"

        有關正方形不是長方形的討論已經有很多了,這也是面向物件的分析與設計中,特別是類的設計中的一個很經典問題,一般相關教科書中都有這個例子。不過很多初學者基本上都很迷糊。主要是教科書講得太專業,太深奧了。個人認為可以從下面兩方面來簡單理解。

   首先看看長方形和正方形的特點:

1、長方形:

     A、 屬性:長,寬

     B、方法:

          求面積=長*寬            求周長=(長+寬)*2

2、正方形:

    A、屬性:邊長  [或者 長=寬]

    B、方法:

          求面積=邊長的平方  [或者 長*寬]      求周長=邊長*4   [或者 (長+寬)*2]

   有了上面的對比以後,可以這樣認識它們:
   其一,絕對來看,長方形與正方形本來就不是同類,當然正方形更不是長方形的子類,為什麼這麼說呢,因為它們從屬性到方法,都有很大的差別,長方形具有兩個屬性,長與寬,而正方形卻只有一個屬性,邊長。並且兩者方法的表述也可以完全不同。互相之間看不到繼承,包含,或者從屬關係。根本就是獨立的兩個不同的類。
   其二,相對來看,正方形就是長方形了,具有長方形的所有特點,具體的正方形表現為,兩個欄位值相等的長方形類的例項。所以從這個角度,可以認為,長方形沒有多型,不存在正方形這樣的子類。
  
   有了這兩種認識,在具體解決問題的時候,就比較簡單了。在類的設計的時候有兩種思路,第一種,可以分別設計長方形,正方形兩個類,井水不犯河水。第二種,只需要設計一個長方形類就行了。
   個人理解,僅供批評。