我有一个有两种方法的课程:
class A {
public methodA();
public methodB();
}
我还有另外两个班级B& C,其中A类为其成员:
class B {
A a;
B(Config config) {
a = config.getA();
}
}
class C {
A a;
C(Config config) {
a = config.getA();
}
}
但是,在C类中,我想实现方法B的不同方式。我想我需要覆盖该方法,但是我需要将类A作为抽象类。那是对的吗?有没有不同的方法来解决这个问题
编辑:我不是直接创建A的新实例。我是从帮助器类中获取它的。
答案 0 :(得分:1)
我需要将A类作为抽象类
不只是确保没有将methodB声明为final,因为无法覆盖final方法。您可以通过在C代码中的A类中创建一个新的匿名类来覆盖方法“inline”:
class C {
A a;
C() {
a = new A() {
@Override
public void methodB() {
// .... code goes here
}
};
}
}
答案 1 :(得分:0)
无法以简单的方式完成。
在Java中,如果需要覆盖方法,则在子类中完成。但是,当您从其他人(A
)获取config
的实例时,您无法控制由config
实例化的类。
有一些替代方案:
如果可以在不知道methodB
内部的情况下完成新的A
,则可以创建A
的包装:
class C {
static class CustomA extends A{
A a;
public CustomA (A a) { this.a = a; }
@Override
public void methodB() {
a.methodB();
a.otherMethod();
}
}
A a;
C(Config config) {
a = new CustomA(config.getA());
}
}
另一种方法是更改Config
以允许创建由A
调用者指定的其他getA()
子类。这可以通过像反射或初始化已经创建的A
实例等错误方式来完成。
另一种选择是将methodB
的逻辑提取到策略中。因此,您可以将策略替换为您想要的任何内容。查看GoF设计模式中的策略模式。