组合是当类通过实例化(可能是内部的)已经实现了该功能的类(而不是从该类继承)来提供某些功能时。
因此,例如,如果您有一个模拟船的类,并且现在被告知您的船应提供一个停机坪,那么从停机坪派生您的船是不自然的,(duh!),您应该您的飞船包含一个停机坪类,并通过某种Ship.getHelipad()
方法将其公开。
在多年的历史(大约十年前)中,人们通常将继承视为聚合功能的快速简便方法,因此有许多“从直升机停机坪继承船”的例子,这些例子当然非常la脚。
但是,“继承时的偏爱”这一措辞经过了认真的措辞,以明确表明这只是一个建议,而不是一条规则。格言的作者非常谨慎,避免说“你永远不要使用继承,只能使用合成”之类的话。这基本上引起了软件工程界的注意,即继承已被过度使用,而在许多情况下,与继承相比,组合产生的设计更加清晰,美观和可维护。
因此,从本质上讲,“从继承的角度看构成合理”的格言暗示着,无论何时面对“继承还是组成?问题,您应该认真思考什么是最合适的策略,最有可能的是,最合适的策略最终将是组合而不是继承。
但是,由于这不是规则,因此您还应该记住,在许多情况下继承更为自然。如果在应该使用继承的地方使用复合,那么代码中将有很多弊端。
回到船舶示例,如果您的船舶需要提供与进行交互的接口FloatingMachine
,那么从抽象FloatingMachine
类派生它是很自然的事情,而抽象类又很可能又从另一个抽象Machine
类派生。
这是组成与继承问题答案的经验法则:
我的课程与它需要公开的接口是否具有“是”关系?如果是,请使用继承。如果没有,请使用合成物。
船舶“是”浮动机器,而浮动机器“是”浮动机器。因此,继承对于那些人来说是完全可以的。但是,船当然不是直升机停机坪。因此,它更好地构成了停机坪的功能。