1

次のシナリオでは、クラス B (同様に D、E、F など) のメソッド doSomething() を、それが使用されるクラス A のメソッドに置き換えたいと考えています。これについてどうすればいいですか?いくつかの例を作成しました。メッセージが伝わることを願っています

public class B implements GetNames{
   public void getNameA(){ return "NameA"; }
   public void getNameB() { return "NameB"; }
   public void doStuff(){
      //print names
      doSomething(getNameA(), getNameB());
      //print names
   }
   public void doSomething(String a, String b){}

}

public class A{
   public void someMethod(){
       B b = new B();
       b.doStuff(); //*So I want it to call the method in B but somehow replace the doSomething method in B with the doSomething method in A
   }

   public void doSomething(String a, String b){
       //print 'blabla' + a
       //print 'blablabla' + b
       //concatenate and print
   }
}
4

2 に答える 2

1

クラスabstractA にインターフェイスを実装さGetNamesせ、それをクラス B で拡張します。

public abstract class A implements GetNames {
   public void doSomething(String a, String b){
       //print 'blabla' + a
       //print 'blablabla' + b
       //concatenate and print
   }
}

public class B extends A {
   public void getNameA(){ return "NameA"; }
   public void getNameB() { return "NameB"; }
   public void doStuff(){
      // class A's doSomething will be called
      doSomething(getNameA(), getNameB());
      //print names
   }
}
于 2013-09-15T17:24:06.500 に答える
1

クラスはクラスAを拡張する必要がありBます。B抽象クラスを作成すると、B.javaファイルは次のようになります。

public abstract class B {
    ...
    public abstract void doSomething(String a, String b);
    ...
}

抽象クラスには、getNameAすでに定義されているメソッドなどのいくつかの機能がありますが、他のメソッドのようなdoSomethingものは、そのサブクラスに実装する必要があります。

クラス A を次のように変更します。

public class A extends B {
    ...
    @Override
    public void doSomething(String a, String b) {
        // custom behaviour
    }
}

Bメソッドの実装が異なるクラスのインスタンスを作成するだけの場合は、次のdoSomethingことができます。

B myBInstance = new B() {
    @Override
    public void doSomething(String a, String b) {
        // custom behaviour here
    }
};

myBInstance.doStuff();

ただし、スタイルとデザインの観点からすると、これは を 1 回だけ使用するための動作を定義する手っ取り早い方法にすぎませんB

于 2013-09-15T17:30:01.957 に答える