为什么要有层次结构?

来源:互联网 发布:python statement 编辑:程序博客网 时间:2024/06/02 23:47

什么是“层次结构”?


关于这个问题,我个人理解是我们在研发早期所定义的分层结构。例如:我们把处理业务的所有接口与实现类统称

为“业务层”,所有与持久化有关的接口与实现类统称为“持久层”一样。


《OOAD》中是这样描述的,“层次结构是抽象的一种分级或排序”,在复杂系统中,最重要的两种层次结构是它的类

结构(“is-a”层次结构)和对象结构(“组合部分”层次结构)。


1、层次结构:单继承


继承是最重要的“是一种”层次结构,它是面向对象系统的基本要素。继承基本上定义了类之间的关系,在这种关系

中,一个类共享了一个或多个类(分别对应于单继承或多继承)中定义的结构或行为。继承代表的是一种抽象的层次

结构,在这种层次结构中,一个子类从一个或多个超类中继承。子类可以扩展或重新定义超类中的结构和行为。


继承表明的“是一种”关系,例如:哈士奇是一种狗,波斯猫是一种猫。继承因此实现了一种“一般/具体”的层次结构,

子类将超类的一般结构和行为具体化。


在继承层次结构中,不同类中共同的结构和行为会被迁移到共同的超类中。超类代表了一般化的抽象,而子类代表了

特殊的具体的抽象。子类一般会添加、修改甚至隐藏来自于超类的属性和方法。


“数据抽象视图提供一个透明的边界,在这个边界之后,方法和状态是隐藏的。继承要求将这个接口开发到一定程度,

允许不通过抽象来访问状态和方法。”对于某一个类而言,通常有两种用户:调用这个类的实例的方法的对象、从这个

类继承的子类。


“子类可能访问其超类的实例变量,可以调用其超类的私有操作,或者直接引用其超类的超类。” 


2、层次结构:多继承


桃子是一种水果,同时它也是一种花卉。一般我们在设计时,都会设计两个新类:水果类、花卉类。那么如果我们想

要一个即开花又结果的桃子建模时又如何办呢?对于这种抽象,需要设计第三个类:花卉水果类,由它来复制来自于

花卉类和水果类的信息。


所以这种抽象更好的表达方式是利用多继承。首先我们创建两个类分别表示花卉,水果的特有的属性。这两个类是独

立的个体,没有超类,一般我们称之为“混入类”。因为它们将与其他类混合在一起,得到新的子类。


多重继承在概念上很简单,但是却为编程引入了一些实际的复杂性。如:来自不同超类的名字的冲突以及重复继承,

当两个或多个超类提供了相同名字的属性或操作时,就会发生名字冲突的情况。


很多语言为了避免这个问题,也就不支持重复继承,如JAVA。而是采用接口方式来变相的实现多继承。


3、层次结构:聚合(组成部分)


如果说“是一种”层次结构说明了一般/特殊关系,那么“组合部分”层次结构则描述的是聚合关系。例如:考虑种植园的

抽象,那么可以认为种植园包含了一些植物和一份培育计划。换句话说,植物是种植园的“组成部分”,培育计划也是

种植园的“组成部分”。这种“组成部分”关系被称之为聚合。


“是一种”层次结构,高层的抽象是一般的,低层的抽象是具体的。因此,我们说花卉类的高层抽象是植物类。对于“组

成部分”层次结构,一个类相对于组成它的实现的其他类来说,它又处于了更高的层次。因此,种植园是植物类的更高

层抽象,“组成部分”层次高于“是一种”层次抽象。


聚合存在所有权的问题,关于种植园的抽象允许不同的时间在种植园内培育不同的植物。更换一种植物不会改变种植

园作为一个整体的特征,删除一个种植园也不会摧毁它的所有植物(可能被移植)。但是,我们认为培育计划对象与

种植园对象却有着固有的关系,不能够独立存在。当创建一个种植园的实例时,就应该创建一个培育计划实例,当删

除种植园对象时,也会删除培育计划实例。

0 0
原创粉丝点击