0

重複の可能性:
super.super.method();はなぜですか。Javaでは許可されていませんか?

これは私のコードです。次のような3つのクラスがあるとします。

public class ExtendsCheck {
    public void move() {
        System.out.println("M in Extends Check");
    }
}

public class ExtendsCheck2 extends ExtendsCheck{
    public void move() {
        System.out.println("M in Extends Check 2");
    }
}

public class ExtendsCheck3 extends ExtendsCheck2{
    public static void main(String[] args)
    {
        ExtendsCheck3 e3 = new ExtendsCheck3();
        e3.move();
    }   
}

を呼び出すと、からe3.move()のメソッドが呼び出されます。move()ExtendsCheck2

私の質問は、ExtendsCheckクラスのmove()を呼び出したい場合、何をしなければならないかということです

4

3 に答える 3

0

クラス内で使用できますparent.move();

ただし、のようなものはありませparent.parent.move();。その理由は、親クラスがリファクタリングされたとき、たとえば抽象クラスが挿入されたときにこれが壊れて、階層の深さが増すためです。

ほとんどの場合、「必要」になると、親クラスの何かを元に戻す必要があるように見えるためparent.parent.method()、継承設計の何かが壊れています。

これが本当に賢明な場合は、いつでも親クラスに「バイパス」関数を提供させることができます。

@Deprecated
protected void originalMove() {
    super.move();
}

これにより、移動操作が明確に定義された親クラスに再度関連付けられます。これを使用することはお勧めしません。ほとんどの場合、デザインの何かが壊れています。たとえば、どこかで抽象クラスを使用したい場合があります。

于 2012-08-16T05:33:10.327 に答える
0

親メソッドを呼び出すsuperには、継承されたメソッドでキーワードを使用します。

たとえば、クラス ExtendsCheck2 のメソッドは次のとおりです。

public void move() {
     super.move();
     System.out.println("M in Extends Check 2");

}

表示されます:

M in Extends Check
M in Extends Check 2

ExtendsCheck3 クラスから直接 ExtendsCheck クラスの move() を呼び出したい場合は、継承アーキテクチャを再検討してください。そのようなコードを記述する必要がある場合は、クラスのアーキテクチャにエラーがあります。

于 2012-08-16T05:29:51.980 に答える
-2

対処する最も簡単な方法は次のとおりです。

Extends E = new Extends();
E.move();

また

super.move(); // as the first statement...
于 2012-08-16T05:50:23.427 に答える