3
public class A {
   protected ClassX a;
   public void foo() {
       operations on a;
   }
}

public class B extends A {
   private ClassY b; // ClassY extends ClassX
   @Override
   public void foo() {
       //wanna the exact same operation as A.foo(), but on b;
   } 
}

わかりにくいタイトルで申し訳ありません。私の質問は次のとおりです。クラス B で foo() を呼び出すとき、クラス A が a に対して持っているのとまったく同じ操作が必要です。Aから同じコードを複製せずにそれを達成するにはどうすればよいですか? クラス B で foo() を省略した場合、機能しますか? または、foo(); で super.foo() を呼び出すとどうなりますか?

4

4 に答える 4

4

ClassY は ClassX を拡張するためprivate ClassY b、クラス B から削除できます。次に、ClassX のインスタンスをaインスタンス変数に設定するだけです。これによりfoo()、クラス B で継承できますが、同じロジックとインスタンス変数を引き続き使用できます。

public class A {
    protected ClassX a

    public void foo() {
        // operations on a;
    }
}

public class B extends A {
    // do something to set an instance of ClassY to a; for example...
    public void setClassY(ClassY b){
        this.a = b;
    }
}
于 2012-05-18T03:08:32.480 に答える
1

ClassXそれは共通のインターフェースを持っているように聞こえClassYます(少なくとも、それらが同じメソッドを持っている場合は、あなたが地球上で呼び出したいと思います)。foo()共通インターフェースの型のオブジェクトを取り込むことを検討しましたか?

public class A {
   private ClassX a;
   protected void foo(ClassXAndClassYInheritMe anObject) {
       operations on anObject;
   }

   public void foo() {
       foo(a);
   }
}

public class B {
   private ClassY b;
   @Override
   public void foo() {
       foo(b);
   }
}
于 2012-05-18T03:12:53.670 に答える
1

A と同じ操作が必要な場合は、B で foo() メソッドを定義しないでください。A で別の操作が必要な場合は、B で foo() メソッドをオーバーライドします。foo() メソッドを拡張する場合B で、最初に A で操作を行い、次に B で操作を行い、次にメソッドの先頭で super.foo() を呼び出します。A の操作を B の操作の後に行う場合は、メソッド foo() の最後で super.foo() を呼び出します。

于 2012-05-18T03:20:47.847 に答える
0

super.foo()オーバーライドされたメソッド内で行うことができます。

于 2012-05-18T03:13:08.640 に答える