也谈"正方形不是长方形"

        有关正方形不是长方形的讨论已经有很多了,这也是面向对象的分析与设计中,特别是类的设计中的一个很经典问题,一般相关教科书中都有这个例子。不过很多初学者基本上都很迷糊。主要是教科书讲得太专业,太深奥了。个人认为可以从下面两方面来简单理解。

   首先看看长方形和正方形的特点:

1、长方形:

     A、 属性:长,宽

     B、方法:

          求面积=长*宽            求周长=(长+宽)*2

2、正方形:

    A、属性:边长  [或者 长=宽]

    B、方法:

          求面积=边长的平方  [或者 长*宽]      求周长=边长*4   [或者 (长+宽)*2]

   有了上面的对比以后,可以这样认识它们:
   其一,绝对来看,长方形与正方形本来就不是同类,当然正方形更不是长方形的子类,为什么这么说呢,因为它们从属性到方法,都有很大的差别,长方形具有两个属性,长与宽,而正方形却只有一个属性,边长。并且两者方法的表述也可以完全不同。互相之间看不到继承,包含,或者从属关系。根本就是独立的两个不同的类。
   其二,相对来看,正方形就是长方形了,具有长方形的所有特点,具体的正方形表现为,两个字段值相等的长方形类的实例。所以从这个角度,可以认为,长方形没有多态,不存在正方形这样的子类。
  
   有了这两种认识,在具体解决问题的时候,就比较简单了。在类的设计的时候有两种思路,第一种,可以分别设计长方形,正方形两个类,井水不犯河水。第二种,只需要设计一个长方形类就行了。
   个人理解,仅供批评。

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值