我来讨论一下纯理论的老问题.长方形和正方形的继承关系.
类的定义中,大家一直争吵不休的就是正方形和长方形的关系.所说,正方形不是长方形的子类,因为它违反了长方形的行为.
然而计算机世界应当是当前世界在计算机中的映射.那么我们来考察长方形和正方形的定义,长方形也就是矩形:为四个内角相等的平行四边形。正方形,是平行四边形;. 有一个角是直角;. 有一组邻边相等。
可是oo对象中,却不能是继承关系。为什么?因为里面的概念已经被偷换了,我们所定义的只是我们在某方面运用到的长方形和正方形。它的定义是全新的,包括了里面所有的数据和所有的方法。不再是我们在数学中定义的长方形和正方形。
也就是说我们的oo定义的类,和现实世界不能完全映射上,只是反映其中我们想要得部分。它的定义是不完整的,过于简单,无法反映数据和数据间的关系,契约太过强硬,只要是所用到的行为子类都要遵守。于是我们很着急,这违反了oo初衷。哲学上告诉我们片面的抽象扩大化,会走到我们所期望的反面。可以说这就是一个例子,原本现实分类中很明显的继承关系,反而到了oo中,不成立了,或者说成为一个问题。不象现实中那样清晰。
我们为了简化而把事情搞复杂了。也许我们在纯粹的程序世界里面还可以不大在意这件事,按照自己定义的就可以了。但是我们要做需求分析时,这就成为大问题。那是必须和现实世界映射上的,任何的扭曲都会带来很多的麻烦。现在工作中我们的麻烦确实很多,原本清晰可见的关系,我们要重新调理。于是我们开始思考。
我们要用现实世界中的关系来指导oo设计,于是什么LSP,DBC都冒出来告诉我们怎么做。可是还是不行。
下一篇讨论这个问题在做用例分析时可能造成的泥潭。如何回避。
在我的blog:http://yingyiyy.blog.163.com/有后续文章。讲谈到这在工作中的实际意义。