2
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 メソッドの宣言と署名はほぼ同じなのですか?

4

2 に答える 2

1

いいえ、Horse は Halter を拡張しないため、Halter のメソッドをオーバーライドしていません。

これはデリゲートの例です (コメントに記載されています)。Facade パターンの場合もあります (他のすべてのクラスを直接通過することで実行できますが、すべての馬ビジネスを 1 か所に配置します)。

これが IS-A 関係と HAS-A 関係の違いです。馬にはホルターがあります (ただしホルターではありません)。

なぜ、tie メソッドの宣言と署名はほぼ同じなのですか?

彼らは同じことをするからです:レシーバーをリードロープに結びます。

たまたま、ホルターと馬の両方をロープに結び付けることができます。しかし、他の側面では、それらはまったく異なる動物です (実際、動物はそのうちの 1 つだけです)。

これはインターフェースで抽象化できると主張する人もいTieableます。次に、コードを呼び出すと、リード ロープを馬とホルター (および場合によっては他のもの) の両方に結び付けることができます。どちらについても知る必要はありません。

于 2012-11-16T04:26:28.763 に答える
0

いいえ、クラスを拡張しないことtieがわかるように、メソッドをオーバーライドしていません。HorseHalter

同じ名前のクラスのインスタンスからHalterクラスメソッドを呼び出すことができるように、メソッド名は同じままです。tieHorse

クラスからのメソッド(同じシグネチャを持つ)内tieのクラスのメソッドへのメソッド呼び出しをラップするだけです。HalterHorse

于 2012-11-16T04:25:18.027 に答える