Bates和Sierra java scjp第2章has-a
Horse类中的tie方法是否覆盖Halter类中的tie方法?为什么tie方法声明和签名几乎完全相同?不,它没有覆盖Bates和Sierra java scjp第2章has-a,java,Java,Horse类中的tie方法是否覆盖Halter类中的tie方法?为什么tie方法声明和签名几乎完全相同?不,它没有覆盖tie方法,正如您所看到的Horse没有扩展Halter类 方法名称保持不变,以便您可以从同名的Horse类的实例调用Halter类tie方法 它只是将对Horse类的tie方法的方法调用封装在Halter类的方法(具有相同的签名)中。否,它不会覆盖Halter中的方法,因为Horse不会扩展Halter 这是一个委托的示例(如注释中所述)。也可能是Facade模式(将所有的业务
tie
方法,正如您所看到的Horse
没有扩展Halter
类
方法名称保持不变,以便您可以从同名的Horse
类的实例调用Halter
类tie
方法
它只是将对
Horse
类的tie
方法的方法调用封装在Halter
类的方法(具有相同的签名)中。否,它不会覆盖Halter中的方法,因为Horse不会扩展Halter
这是一个委托的示例(如注释中所述)。也可能是Facade模式(将所有的业务放在一个地方,即使它可以通过直接遍历所有其他类来完成)
这就是is-A和HAS-A关系之间的区别。马有缰绳(但不是缰绳)
为什么tie方法声明和签名几乎完全相同
因为他们做的事情是一样的:把听筒绑在牵引绳上
碰巧的是,你可以把缰绳和马都系在绳子上。但在其他方面,它们是完全不同的动物(事实上,它们中只有一种是动物)
有些人会争辩说,这可以抽象为一个可分层的接口。然后,调用代码可以将引导绳系在马和缰绳(可能还有其他东西)上,而不需要知道其中任何一个。那么它们是具有相同签名的两种不同方法?我从未见过这种性质的示例,因此它让我感到困惑。是的,它们是两个具有相同签名的不同方法,但两个类之间没有继承关系,它们没有重写。那么,tie是否因为缺少主方法而被放入包装器方法中?这是我能想到的唯一原因,它必须被包装起来。谢谢,这些答案真的很有帮助。对不起,我不明白你所说的“main方法”(或者“wrapper方法”)是什么意思。我认为这里的想法是,马为客户机代码提供接口,Halter做与系绳索相关的实际工作。你不知道我所说的“主要方法”是什么意思吗?真的吗?
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
}
}