标签:继承体系 忽略 组成 种类型 family 映射关系 splay 关注 不可
公理化之路
首先让我们来理解一下来自百科中传统的对面向对象的定义和说明:
抽象与分类:忽略事物的非本质特征,只注意那些与当前目标有关的本质特征,从而找出事物的共性,叫做抽象,把具有共同性质的事物划分为一类,得到一个抽象的概念,叫做分类。
类是具有相同属性和服务的一组对象的集合,它为属于该类的全部对象提供了统一的抽象描述,其内部包括属性和服务两个主要部分,类的作用是用来创建对象,对象是类的一个实例。
不同程度的抽象可得到不同层次的分类,较多地忽略事物之间的差别得到较一般的类,较多地注意事物之间的差别得到较特殊的类。
那么我们是怎么来看这样的定义呢?如果我们试做使用集合的观点来看看我们是否有矛盾和冲突。
按照上面描述类是一个集合,是包含所有对象的集合,那么其对象表示其集合的元素,那么这些对象组成了这样的集合的划分。
对于继承关系来说,如果B继承于A ,则A是B的父类,B是A的子类。
按照传统的观点,如果表示B?A(?表示子集的包含关系)因为B是A的一个子集。
那么对于一个对象b是类B的元素,b∈B,那么根据B?A则可以推到出b∈A,即b也是类A中的一个元素。
因为b是类A中的一个元素,那么根据上面的描述,A类型可以创建出包含在其集合内部的b对象,然而通过类A来创建对象b是不可能的,因为b包含了A无法创建的属性和服务,所以就有两种可能出现了问题。
第一种情况是B不是A的子集,即继承关系,不是集合的子集包含关系。
第二种情况是对象不是类的集合中的元素,其对象和类不是元素和集合的包含关系。
现在,让我们来看看第一种情况,B是A的一种类型,因为A中的元素包含在B中,同时,A中的非虚拟函数也包含在B中,通过类的多态定义,B中的操作与A中的操作在逻辑意义上是相同的。所以继承关系是一种抽象和具体的映射关系,所以可以看着B是A具体化,A是B的抽象化。而这种集合间的关系也是不体现在继承关系上。
对于第二种情况,其实是一个比较复杂的情况,对象和类是一种什么样的关系呢?这个在下面我们还要继续进行分析。
对于上面所描述的继承关系还有另外一种情况就是表示为A?B(A是B的子集)。
那么和上面一样的推导过程:对于a∈A,则a∈B。
但是a无法通过B进行创建,因为B创建的对象有比a具有更多的特性。
因为可能存在C继承于A,那么a可能又成为C的对象,那么a就是B∩C,但是这种概念也是违反事实的(因为B∩C可能是一个空集)。
让我们用一个实际的例子来说明一下,猫继承于动物,同时狗继承于动物,MiMi是一个动物,而且是一只猫,如果按照上面的观点,MiMi是一个只猫,也是一只狗。所以这是荒谬的。
另外如果这个A是一个接口,其不能实例化一个对象,那么类是一个空集,元素个数为0,因此对于这个继承体系来说,实际上除了属性还有抽象的操作,而操作才是最重要的特征。
由此我们可以看出,将类描述成一个集合,将对象描述为这个集合的元素是有问题的。那么类应该是一个什么概念呢?类应该是一系列实体的某个特性的抽象,而这些抽象在数学上是如何体现的呢?其与对象、子类之间的关系具体又指什么呢?同时需要关注类不仅具有属性还具有特定的操作规则。
所以对象组成的集合不是类,相似对象特征组成的集合也不是类,类不是集合,类实际上是一个元素,是对象的共同相似特征经过映射后的一个元素或逻辑概念实体。
连载02:软件体系设计新方向:数学抽象、设计模式、系统架构与方案设计(简化版)(袁晓河著)
标签:继承体系 忽略 组成 种类型 family 映射关系 splay 关注 不可
原文地址:http://blog.51cto.com/13832308/2132384