13.9 组合

一个类被定义后,目标就是要把它当成一个模块来使用,并把这些对象嵌入到你的代码中去,同其他数据类型及逻辑执行流混合使用。有两种方法可以在你的代码中利用类。第一种是组合(composition)。就是让不同的类混合并加入到其他类中,来增加功能和代码重用性。你可以在一个大点的类中创建你自己的类的实例,实现一些其他属性和方法来增强对原来的类对象。另一种方法是通过派生,我们将在下一节中讨论它。

举例来说,让我们想象一个对本章一开始创建的地址本类的加强性设计。如果在设计的过程中,为names、addresses等创建了单独的类,那么最后我们可能想把这些工作集成到AddrBookEntry类中去,而不是重新设计每一个需要的类。这样就节省了时间和精力,而且最后的结果是容易维护的代码——一块代码中的bug被修正,将反映到整个应用中。

这样的类可能包含一个Name实例,以及其他如StreetAddress、Phone (home、work、telefacsimile、pager、mobile等)、Email (home、work等),还可能需要一些Date实例(birthday、wedding、anniversary等)。下面是一个简单的例子:

13.9 组合 - 图1

NewAddrBookEntry类由它自身和其他类组合而成。这就在一个类和其他组成类之间定义了一种“有一个”(has-a)的关系。比如,我们的NewAddrBookEntry类“有一个” Name类实例和一个Phone实例。

创建复合对象就可以实现这些附加的功能,并且很有意义,因为这些类都不相同。每一个类管理它们自己的名字空间和行为。不过当对象之间有更接近的关系时,派生的概念可能对你的应用程序来说更有意义,特别是当你需要一些相似的对象,但却有少许不同功能的时候。