此方法中的窍门在于使用类而不破坏现有程序代码。你将会在本章中看到两种达到这一目的
的方法。第一种方法非常直观:你只需在新的类中产生现有类的对象。由于新的类是由现有
类的对象所组成,所以这种方法被称为组合(composition)。该方法只是复用了现有程序代
码的功能,而非它的形式。
第二种方法则更细致一些,它按照现有类的类型来创建新类。你无需改变旧有类的形式,仅
仅只是采用它的形式并在其中添加新代码。这种神奇的方式被称为继承(inheritance),而且
编译器可以完成其中大部分工作。继承是面向对象程序的基石之一,我们将探究其
含义与功能。
就组合(composition)和继承(inheritance)而言,其语法和行为大多是相似的。由于它们
是利用现有类型生成新类型,所以这样做极富意义。你将会了解到这两种程序代
码重用机制。
组合(类中有类) 继承(类继承类)接口(实现细节,还有客户端的访问控制.更为明显可以以静制动)
组合与继承之间选择
组合和继承都允许你在新的类中设置子对象(subobject),组合是显式地这样做的,而继承
则是隐式的。你或许想知道二者间的区别何在,以及怎样在二者之间做出选择。
组合技术通常用于你想要在新类中使用现有类的功能而非它的接口的情形。即,你在新类中
嵌入某个对象,借其实现你所需要的功能,但新类的用户看到的只是你为新类所定义的接口,
而非嵌入对象的接口。为取得此效果,你需要在新类中嵌入一个 private 的现有类的对象。
车\宝马\轮胎
你就会发现,用一个“交通工具”对象来构成一部“车子”是毫无意义的,因为“车子”并
不包含“交通工具”,它仅是一种(is-a)交通工具。其中“is-a(是一个)”的关系是用继承
来表达的,而“has-a(有一个)”的关系则是用组合来表达的。