我的问题不是Java特定的,但我认为它更像是设计模式问题。 我试着用一个例子来解释:
我有两个班级(A和B),B正在扩展A. 这两个类看起来像这样:
public class A {
protected int method1() {
System.out.println(method3());
}
protected int method3() {
return 3;
}
}
public class B extends A {
protected void method2() {
//Calling method1
method1(); // Output : 3
//Calling method1 another time but method3 needs to be slightly different
method1(); // Output needs to be : 6
}
}
所以,我想调用两次相同的方法但是我想在第二次调用时修改method3()里面的内容。 显然,我不想定义两个不同的method1(),因为method1不仅打印出一个int,而且它正在做更多的事情。
第二种方法3可能如下所示:
protected int method3bis() {
return 2*3;
}
我真的想避免在所有方法中传递某种论据,这看起来像这样:
protected int method1(int arg) {
if(arg == 0)
System.out.println(method3());
if(arg == 1)
System.out.println(method3bis());
}
你知道有什么好办法吗? 在此先感谢: - )
答案 0 :(得分:0)
你可以通过创建一个新的A对象来实现这一点,但这不是一个很好的方法。你最好使用if / else块。
import java.lang.reflect.*;
public class B extends A {
protected void method2() {
try {
Class a = Class.forName("A");
Object aa = a.newInstance();
((A) aa).method1(); // Output : 3
} catch (Exception e) {
e.printStackTrace();
}
//Calling method1 another time but method3 needs to be slightly different
this.method1(); // Output needs to be : 6
}
@Override
protected int method3() {
return 2*3;
}
}
答案 1 :(得分:0)
在Java中无法在运行时更改方法的实现。
覆盖方法时,可以调用直接超类实现,例如:
class Super {
void method1() {
System.out.println(3);
}
}
class Sub {
@Override
void method1() {
System.out.println(2 * 3);
}
void method2() {
// printing 3
super.method1();
// printing 6
this.method1();
}
}
但是,这不能以您所描述的方式使用(在更改 method3 的实现时调用 method1 )。而实施你所描述的内容也是一种非常混乱的方式。
您应该使用方法参数,因为这就是它们的用途。