1.4 实现的重用

创建了一个类并进行了测试后,这个类(理论上)就成了有用的代码单元。重用性并不像许多人所希望的那样容易达到,产生一个好设计需要经验和洞察力。但是只要有了这样的设计,就应该提供重用。代码重用是面向对象程序设计语言的最大优点之一。

重用一个类最简单的方法就是直接使用这个类的对象,并且还可以将这个类的对象放到一个新类的里面。我们称之为“创建一个成员对象”。可以用任何数量和类型的其他对象组成新类,通过组合得到新类所希望的功能。因为这是由已经存在的类组成新类,所以称为组合(composition)[或者更通常地称为聚合(aggregation)]。组合常常被称为“has-a(有)”关系,比如“在小汽车中有发动机”一样。

(上面的UML图用实心菱形表示组合,说明这里有一个小汽车。通常我将采用一种更简单的形式,即仅用一条不带菱形的线来表示一个关联。[1]

1.4 实现的重用 - 图1

组合带来很大的灵活性,新类的成员对象通常是私有的,使用这个类的客户程序员不能访问它们。这种特点允许我们改变这些成员而不会干扰已存在的客户代码。我们还可以在运行时改变这些成员对象,动态地改变程序的行为。下面将介绍的继承没有这种灵活性,因为编译器必须在用继承方法创造的类上加入编译时限制。

因为继承在面向对象的程序设计中很重要,所以它常常得到高度重视,并且新程序员可能会产生在任何地方都使用继承的想法。这会形成拙笨和极度复杂的设计。实际上,当创建新类时,程序员应当首先考虑组合,因为它更简单和更灵活。如果采用组合的方法,设计将变得清晰。一旦我们具备一些经验之后,就能很明显地知道什么时候需要采用继承方法。

[1]这种形式对于大部分图通常是足够详细的,不需要特别指出何处使用聚合或称组合。