如何覆盖间接调用的方法

时间:2015-04-26 07:16:34

标签: java design-patterns

我不太确定如何恰当地标题这个问题,我会尽可能清楚地描述它:。

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。欣赏任何想法。

3 个答案:

答案 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,并覆盖子类中的methodBmethodA

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的情况下工作。 理想情况下,您应该创建一个工厂类,您可以在其中委派对象创建的工作。因此,您将根据特定条件创建所需的实例。