如何覆盖间接调用的方法

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。感谢任何想法。

因为 ClassAmethodA 总是 returns ClassB 的实例,如果你想覆盖 ClassBmethodB,您必须同时扩展 ClassA 和 ClassB 并覆盖子 类.

中的 methodAmethodB
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