我来讨论一下纯理论的老问题.长方形和正方形的继承关系.

siberian 07-03-01
              

类的定义中,大家一直争吵不休的就是正方形和长方形的关系.所说,正方形不是长方形的子类,因为它违反了长方形的行为.

然而计算机世界应当是当前世界在计算机中的映射.那么我们来考察长方形和正方形的定义,长方形也就是矩形:为四个内角相等的平行四边形。正方形,是平行四边形;. 有一个角是直角;. 有一组邻边相等。

可是oo对象中,却不能是继承关系。为什么?因为里面的概念已经被偷换了,我们所定义的只是我们在某方面运用到的长方形和正方形。它的定义是全新的,包括了里面所有的数据和所有的方法。不再是我们在数学中定义的长方形和正方形。

也就是说我们的oo定义的类,和现实世界不能完全映射上,只是反映其中我们想要得部分。它的定义是不完整的,过于简单,无法反映数据和数据间的关系,契约太过强硬,只要是所用到的行为子类都要遵守。于是我们很着急,这违反了oo初衷。哲学上告诉我们片面的抽象扩大化,会走到我们所期望的反面。可以说这就是一个例子,原本现实分类中很明显的继承关系,反而到了oo中,不成立了,或者说成为一个问题。不象现实中那样清晰。

我们为了简化而把事情搞复杂了。也许我们在纯粹的程序世界里面还可以不大在意这件事,按照自己定义的就可以了。但是我们要做需求分析时,这就成为大问题。那是必须和现实世界映射上的,任何的扭曲都会带来很多的麻烦。现在工作中我们的麻烦确实很多,原本清晰可见的关系,我们要重新调理。于是我们开始思考。

我们要用现实世界中的关系来指导oo设计,于是什么LSP,DBC都冒出来告诉我们怎么做。可是还是不行。

下一篇讨论这个问题在做用例分析时可能造成的泥潭。如何回避。

在我的blog:http://yingyiyy.blog.163.com/有后续文章。讲谈到这在工作中的实际意义。

              

3
Coolyu0916
2007-03-01 20:24

我不知道谁讨论说正方形不是长方形的子类的
你能把文章给我转贴一下么??
我觉得既然从数学定义上是,实际设计也一定是。
要不然oo的设计就是个错误

checkcode
2007-03-01 21:53

我觉得可能是这个问题,当
正方形继承长方形的时候,可以使正方形is a长方形
但是无法保证,x形继承正方形时,使x形既具有正方形的行为又具有长方形的行为

Coolyu0916
2007-03-01 22:11

没有明白楼上的意思
x继承了正方形必然具备正方形的特性
所谓继承的意思就是 XX就是XX
男人就是人 ,女人是人
人生孩子是错的
必须是女人生孩子
楼主是说 老女人不具备生孩子的方法么,他具备这个方法,但是返回的东西不同??
可是这在生活中也是必然的
if(age > 60) return null; 或者throw excption(“年纪太大”)
不是这样么??

siberian
2007-03-01 22:48

其实,这在《java编程思想》里面认为是可以成立的。只不过某些涉及父类的方法要修改。
我认为也是成立的。只不过我们从这个争论为什么会发生,会发现类定义里面类太简单,没有涉及到约束的问题。
这是要说的重点。一个事物必然要包括一个约束问题。也就是说一个类要成功映射。不是他的所有属性,方法都必须被遵守,而是只要它符合一个约束,就成立了。

9Go 1 2 3 4 ... 9 下一页