有关正方形不是长方形的讨论已经有很多了,这也是面向对象的分析与设计中,特别是类的设计中的一个很经典问题,一般相关教科书中都有这个例子。不过很多初学者基本上都很迷糊。主要是教科书讲得太专业,太深奥了。个人认为可以从下面两方面来简单理解。
首先看看长方形和正方形的特点:
1、长方形:
A、 属性:长,宽
B、方法:
求面积=长*宽 求周长=(长+宽)*2
2、正方形:
A、属性:边长 [或者 长=宽]
B、方法:
求面积=边长的平方 [或者 长*宽] 求周长=边长*4 [或者 (长+宽)*2]
有了上面的对比以后,可以这样认识它们:
其一,绝对来看,长方形与正方形本来就不是同类,当然正方形更不是长方形的子类,为什么这么说呢,因为它们从属性到方法,都有很大的差别,长方形具有两个属性,长与宽,而正方形却只有一个属性,边长。并且两者方法的表述也可以完全不同。互相之间看不到继承,包含,或者从属关系。根本就是独立的两个不同的类。
其二,相对来看,正方形就是长方形了,具有长方形的所有特点,具体的正方形表现为,两个字段值相等的长方形类的实例。所以从这个角度,可以认为,长方形没有多态,不存在正方形这样的子类。
有了这两种认识,在具体解决问题的时候,就比较简单了。在类的设计的时候有两种思路,第一种,可以分别设计长方形,正方形两个类,井水不犯河水。第二种,只需要设计一个长方形类就行了。
个人理解,仅供批评。