我不太确定如何恰当地标题这个问题,我会尽可能清楚地描述它:。
Interface InterfaceB {
void methodB();
}
Class ClassB implements InterfaceB {
void methodB() {
//...
}
}
Class ClassA {
InterfaceB methodA() {
return new ClassB();
}
}
Class MyClass {
public static void main(String[] args) {
ClassA a = new ClassA();
InterfaceB b = a.methodA();
b.methodB(); // override this guy
}
}
我想覆盖methodB,而不更改ClassA和ClassB。欣赏任何想法。
答案 0 :(得分:2)
这是你可以做的:
ClassA a = new ClassA() {//extend class A
InterfaceB methodA() {//Override methodA
return new ClassB() {//extend class B
void methodB() {//Override methodB
//...
}
};
}
};
你已经覆盖了方法B而没有改变A类或B类。尽管如此,你并不需要从ClassA扩展。您可以创建factory
,将其作为依赖项传递给ClassA,并将参数传递给methodA
,告诉它应该使用classB
的具体实现来调用methodB
答案 1 :(得分:1)
由于methodA
的{{1}}始终返回ClassA
的实例,如果您要覆盖ClassB
ClassB
,则必须扩展ClassA和ClassB,并覆盖子类中的methodB
和methodA
。
methodB
现在
class ClassSubB extends ClassB {
@Override
void methodB() {
//...
}
}
class ClassSubA extends ClassA {
@Override
InterfaceB methodA() {
return new ClassSubB();
}
}
答案 2 :(得分:-1)
Interface InterfaceB {
void methodB();
}
Class ClassB implements InterfaceB {
void methodB() {
//...
}
}
class ClassSubClassB extends ClassB {
@Override
void methodB() {
//...
}
}
Class ClassA {
InterfaceB methodA(boolean overriddenMethod) {
if(overriddenMethod)
return new ClassSubClassB();
else
return new ClassB();
}
}
Class MyClass {
public static void main(String[] args) {
ClassA a = new ClassA();
InterfaceB b = a.methodA(true);
b.methodB(); // override this guy
}
}
这可以在不必覆盖classA的情况下工作。 理想情况下,您应该创建一个工厂类,您可以在其中委派对象创建的工作。因此,您将根据特定条件创建所需的实例。