14

以下の例では、クラスCのメソッドからどのようにアクセスできますか?method()A

class A {
    public void method() { }
}

class B extends A{
    public void method() { }
}

class C extends B{
    public void method() { }

    void test() {
        method();          // C.method()
        super.method();    // B.method()
        C.super.method();  // B.method()
        B.super.method();  // ERROR <- What I want to know
    }
}

私が得ているエラーは

タイプBの囲んでいるインスタンスはスコープ内でアクセスできません

回答:いいえ、これは不可能です。Javaはそれを許可していません。同様の質問

4

4 に答える 4

19

あなたはできません-そして非常に慎重に。カプセル化に違反します。あなたはやりたいことは何でもスキップするでしょうB.method-おそらく引数を検証し(何かがあったと仮定して)、不変条件を強制するなど。

B派生クラスが定義された動作をスキップできる場合、どのようにしてその世界の一貫したビューを維持できると期待できますか?

Bが提供する動作がCに適していない場合、それを拡張するべきではありません。このように継承を悪用しようとしないでください。

于 2011-01-15T08:38:22.503 に答える
11

次のコードは回避策になる可能性があります (うまくいきませんが、動作するはずです)。

class A {
    public void method() { }
}

class B extends A {
    public void method() { }
    protected void superMethod() {
         super.method();
    }
}

class C extends B {
    public void method() { }

    void test() {
        method();          // C.method()
        super.method();    // B.method()
        superMethod();     // A.method()
    }
}
于 2011-01-15T11:18:53.477 に答える
2

これを直接行う方法はありませんが、いつでも回避策を試すことができます。

クラスCからクラスAのメソッドにアクセスする目的はわかりませんが、いつでもそのメソッドを入手できます。

クラスCにクラスAのインスタンスを作成し、それが単純すぎる場合は、リフレクションAPIを使用してみてください...[リンクテキスト][1]

Extreme Java

于 2011-01-15T11:00:35.393 に答える
1

あなたはすべきではありません。

のメソッドにアクセスする場合は、の代わりにAから拡張します。AB

Bextendsを拡張すると、基になるオブジェクトがそれ自体の方法以外の方法で操作されないことをA前提としています。Aしたがって、のメソッドに直接アクセスすることでA、関数の方法を壊している可能性がありBます。

たとえば、リストを実装するクラスがあるとしますMyList。ここで、このリストをと呼ばれる別のクラスで拡張するとします。このクラスは、メソッドとメソッドをMyCountingListオーバーライドして、追加/削除される要素をカウントします。提供されている方法をバイパスする場合は、代わりに使用している方法を使用すると、のカウント機能が機能しなくなります。add()remove()add()MyCountingListMyListMyCountingList

だから、要するに、そうしないでください。

于 2011-01-15T08:37:20.043 に答える