Bates和Sierra java scjp第2章hasa
public class Horse extends Animal {
private Halter myHalter = new Halter();
public void tie(LeadRope rope) {
myHalter.tie(rope); // Delegate tie behavior to the
// Halter object
}
}
public class Halter {
public void tie(LeadRope aRope) {
// Do the actual tie work here
}
}
Horse类中的tie方法是否覆盖Halter类中的tie方法?为什么tie方法声明和签名几乎完全相同
# 1 楼答案
不,它没有覆盖
tie
方法,正如您所看到的Horse
没有扩展Halter
类方法名保持不变,以便可以从同名的
Horse
类的实例调用Halter
类tie
方法它只是将对
Halter
类的tie
方法的方法调用封装在一个来自Horse
类的方法(具有相同的签名)中# 2 楼答案
不,它没有覆盖Halter中的方法,因为Horse不扩展Halter
这是一个代表的例子(如评论中所述)。也可能是门面模式(将所有的马业务放在一个地方,尽管它可以通过直接查看所有其他类来完成)
这就是is-A和HAS-A关系之间的区别。马有缰绳(但不是缰绳)
因为他们做的事情是一样的:把听筒绑在牵引绳上
碰巧的是,你可以把缰绳和马都系在绳子上。但在其他方面,它们是完全不同的动物(事实上,它们中只有一种是动物)
有些人会说,这可以在
Tieable
接口中抽象出来。然后,调用代码可以将引导绳系在马和缰绳(可能还有其他东西)上,而不需要知道其中任何一个