您仍然会有一个
scratch()方法,但不会被派生类覆盖:
public class Cat { Claw claw_; public Cat(Claw claw) {claw = claw_;} public final void scratch() { if (claw_ != null) { claw_.scratch(this); } }}这使您可以将抓取逻辑委托给所包含的
Claw对象(如果存在)(如果没有爪,则不进行抓取)。从cat派生的类在如何刮擦方面没有发言权,因此无需根据能力创建影子层次结构。
同样,由于派生类无法更改方法的实现,因此它们不会破坏
scratch()基类接口中方法的预期语义的问题。
如果将其极端化,您可能会发现您有很多类,而没有很多派生-大多数逻辑都委托给组合对象,而不委托给派生类。



