如何覆盖间接调用的方法
How to override a indirectly invoked method
我不太确定如何正确命名这个问题,我会尽量描述清楚:.
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。感谢任何想法。
因为 ClassA
的 methodA
总是 returns ClassB
的实例,如果你想覆盖 ClassB
的 methodB
,您必须同时扩展 ClassA 和 ClassB 并覆盖子 类.
中的 methodA
和 methodB
class ClassSubB extends ClassB {
@Override
void methodB() {
//...
}
}
class ClassSubA extends ClassA {
@Override
InterfaceB methodA() {
return new ClassSubB();
}
}
现在
class MyClass {
public static void main(String[] args) {
ClassA a = new ClassSubA(); // create an instance of ClassSubA
InterfaceB b = a.methodA(); // will return an instance of ClassSubB
b.methodB(); // will call methodB of ClassSubB
}
}
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 即可工作。
理想情况下,您应该创建一个工厂 class,您可以在其中委托创建对象的工作。因此,您将根据特定条件创建所需的实例。
这是你能做的:
ClassA a = new ClassA() {//extend class A
InterfaceB methodA() {//Override methodA
return new ClassB() {//extend class B
void methodB() {//Override methodB
//...
}
};
}
};
您已经覆盖了 methodB 而没有更改 class A 或 class B。话虽如此,您实际上并不需要从 ClassA 扩展。您可以创建一个 factory
,将其作为依赖项传递给 ClassA,并将参数传递给 methodA
,告诉它应使用 classB
的哪个具体实现来调用 methodB
我不太确定如何正确命名这个问题,我会尽量描述清楚:.
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。感谢任何想法。
因为 ClassA
的 methodA
总是 returns ClassB
的实例,如果你想覆盖 ClassB
的 methodB
,您必须同时扩展 ClassA 和 ClassB 并覆盖子 类.
methodA
和 methodB
class ClassSubB extends ClassB {
@Override
void methodB() {
//...
}
}
class ClassSubA extends ClassA {
@Override
InterfaceB methodA() {
return new ClassSubB();
}
}
现在
class MyClass {
public static void main(String[] args) {
ClassA a = new ClassSubA(); // create an instance of ClassSubA
InterfaceB b = a.methodA(); // will return an instance of ClassSubB
b.methodB(); // will call methodB of ClassSubB
}
}
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 即可工作。 理想情况下,您应该创建一个工厂 class,您可以在其中委托创建对象的工作。因此,您将根据特定条件创建所需的实例。
这是你能做的:
ClassA a = new ClassA() {//extend class A
InterfaceB methodA() {//Override methodA
return new ClassB() {//extend class B
void methodB() {//Override methodB
//...
}
};
}
};
您已经覆盖了 methodB 而没有更改 class A 或 class B。话虽如此,您实际上并不需要从 ClassA 扩展。您可以创建一个 factory
,将其作为依赖项传递给 ClassA,并将参数传递给 methodA
,告诉它应使用 classB
的哪个具体实现来调用 methodB