Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bates和Sierra java scjp第2章has-a_Java - Fatal编程技术网

Bates和Sierra java scjp第2章has-a

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模式(将所有的业务

Horse类中的tie方法是否覆盖Halter类中的tie方法?为什么tie方法声明和签名几乎完全相同?

不,它没有覆盖
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
    }
}