2

これは私がやろうとしていることです:

class A {
    void myMethod() {
        // execute A
    }
}

class B extends A {
    void myMethod() {
        // execute B
    }
}

class C extends B {
    void myMethod() {
        // execute C
        // execute myMethod in A, without touching myMethod in B OR both
    }
}

私はこれを条件付きで行いたいと思います。つまり、myMethod内部Bにあるものを呼び出す場合とそうでない場合がありますが、常にmyMethodinsideを呼び出しますA

電話super.myMethod()することでCを手に入れることができますmyMethodが、欲しいのはBだけです。それは可能ですか?「仮想」のことは聞いたことがありますが、使い方はわかりません... まだ.myMethodA

4

3 に答える 3

3

いいえ、Java では意図的にできません。クラスBはオーバーライドするため、さらに派生するクラスからmyMethodinの実装を隠します。の呼び出しを許可すると、Aこのカプセル化に違反します。の正しい機能にとって重要な、内部呼び出しの前にいくつかの更新を実行するケースを考えてみましょう。これらの更新がないと、 の契約に違反する可能性があります。したがって、 を呼び出さずに派生クラスを呼び出すことはできません。CmyMethodAB.myMethodA.myMethodBBA.myMethodB.myMethod

通常、このようなことをしたい場合、設計に欠陥があります。

もちろん、コメントで Dave が提案したようなことを行うこともできます: の実装B.myMethodを callに変更できますA.myMethodBいつ呼び出すかは が制御できるため、これで問題ありませんA.myMethod。したがって、契約に違反しないように注意することができます。

別のアイデアは、必要な動作をA別のメソッドに分解して、これを呼び出すことです。

于 2012-09-04T16:26:49.117 に答える
0

これが必要な場合は、A.myMethod()多分やりすぎです。アクセスレベルを使用して、いくつかの小さなメソッドにリファクタリングしてみてくださいprotected

Bこれにより、との両方からこれらのメソッドを呼び出すことができますC

于 2012-09-04T16:30:34.273 に答える
0

設計を変更する可能性についてのほとんどの回答に同意しますが、最初のメソッドに変数ブール値を渡すことができると直接答えることができます。B のメソッドのロジック全体は、ブール値に応じた条件付き if ステートメントに依存する必要があります。この if ステートメントの外で必ず super.myMethod() を呼び出してください。

このようなもの:

void myMethod(boolean execB) {
// execute B
super.myMethod(execB);
    if(execB)
    {
        //B logic
    }
}

ただし、B の方法のみが変数を使用しているため、これは実際には最善ではありません。したがって、設計のリファクタリングが適切な決定である可能性があります。

于 2012-09-04T17:11:22.667 に答える