Java核心技术卷I基础知识(原书第9版)
上QQ阅读APP看书,第一时间看更新

4.1.4 类之间的关系

在类之间,最常见的关系有

依赖(“uses-a”)

聚合(“has-a”)

继承(“is-a”)

依赖(dependence),即“uses-a”关系,是一种最明显的、最常见的关系。例如,Order类使用Account类是因为Order对象需要访问Account对象查看信用状态。但是Item类不依赖于Account类,这是因为Item对象与客户账户无关。因此,如果一个类的方法操纵另一个类的对象,我们就说一个类依赖于另一个类。

应该尽可能地将相互依赖的类减至最少。如果类A不知道B的存在,它就不会关心B的任何改变(这意味着B的改变不会导致A产生任何bug)。用软件工程的术语来说,就是让类之间的耦合度最小。

聚合(aggregation),即“has-a”关系,是一种具体且易于理解的关系。例如,一个Order对象包含一些Item对象。聚合关系意味着类A的对象包含类B的对象。

注释:有些方法学家不喜欢聚合这个概念,而更加喜欢使用“关联”这个术语。从建模的角度看,这是可以理解的。但对于程序员来说,“has-a”显得更加形象。喜欢使用聚合的另一个理由是关联的标准符号不易区分,请参看表4-1。

表4-1 表达类关系的UML符号

继承(inheritance),即“is-a”关系,是一种用于表示特殊与一般关系的。例如,Rush Order类由Order类继承而来。在具有特殊性的RushOrder类中包含了一些用于优先处理的特殊方法,以及一个计算运费的不同方法;而其他的方法,如添加条目、生成账单等都是从Order类继承来的。一般而言,如果类A扩展类B,类A不但包含从类B继承的方法,还会拥有一些额外的功能(下一章将详细讨论继承,其中会用较多的篇幅讲述这个重要的概念)。

很多程序员采用UML(Unified Modeling Language,统一建模语言)绘制类图,用来描述类之间的关系。图4-2就是这样一个例子。类用矩形表示,类之间的关系用带有各种修饰的箭头表示。表4-1给出了UML中最常见的箭头样式。

图4-2 类图