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

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();

尽管从样式和设计角度来看,这只是定义一次性使用B.

于 2013-09-15T17:30:01.957 回答
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 回答