对象之间的关系

  继承时对象之间的一种简单关系,可以让派生类完整地获得基类的特性,而且派生类也可以访问基类内部的一些工作代码(通过受保护的成员)。对象之间还具有其他一些重要关系。

  本节简要讨论下述关系:

  ● 包含关系: 一个类包含另一个类。这类似于继承关系,但包含类可以控制对被包含类的成员的访问,甚至在使用被包含类的成员前进行其他处理。

  ● 集合关系: 一个类用作另一个类的多个实例的容器。这类似于对象数组,但集合具有其他功能,包括索引、排序和重新设置大小等。

  1. 包含关系

  用一个成员字段包含对象实例,就可以实现包含( containment )关系。这个成员字段可以是公共字段,此时与继承关系一样,容器对象的用户就可以访问它的方法和属性,但不能像继承关系那样,通过派生类访问类的内部代码。

  另外,可以让被包含的成员对象变成私有成员。如果这么做,用户就不能直接访问任何成员,即使这些成员是公共的。但可以使用包含类的成员访问这些私有成员。也就是说,可以完全控制被包含的类对外提供什么成员(或者不提供任何成员),还可以在访问被包含类的成员前,在包含类的成员上执行其他处理。

  例如,Cow 类包含一个 Udder 类,它有一个公共方法 Milk()Cow 对象可以按照要求调用这个方法,作为其 SupplyMilk() 方法的一部分,但 Cow 对象的用户看不到这些细节,或者这些细节对 Cow 对象的用户并不重要。

  在 UML 中,被包含类可以用关联线条来表示。对于简单包含关系,可以用带有 1 的线条说明一对一的关系(一个 Cow 实例包含一个 Udder 实例)。为清晰起见,也可以把被包含的 Udder 类实例表示为 Cow 类的私有字段,如图 8-10 所示

图 8-10

  2. 集合关系

  第 5 章讨论了如何使用数组存储多个同类型变量。这也适用于对象(前面使用的变量类型实际上是对象)。例如:

  1. Animal[] animals = new Animal[5];

  集合基本上就是一个增加了功能的数组。集合以与其他对象相同的方式实现为类。它们通常以所存储的对象名称的复数形式来命名,例如用类 Animals 包含 Animal 对象的一个集合。

  数组与集合的主要区别是,集合通常实现额外的功能,例如 Add()Remove() 方法可添加和删除集合中的项。而且集合通常有一个 Item 属性,它根据对象的索引返回该对象。通常,这个属性还允许实现更复杂的访问方法。例如,可以设计一个 Animals,让 Animal 对象根据其名称来访问。

  其 UML 表示 如图 8-11 所示

  图 8-11 中没有包含成员,因为这里描述的是关系。连线末尾的数字表示一个 Animals 对象可以包含 0 个或多个 Animal 对象。第 11 章将详细讨论集合。

图 8-11