-1

我的代码与此类似:

class Base{
    public void handleObject(A a){
        //more code...
        System.out.println("A");
    }
}

class Sub extends Base{
    public void handleObject(B b){
        //more code specific to this instance and class B
        System.out.println("B");
    }
    public void handleObject(C c){
        //more code specific to this instance and class C
        System.out.println("C");
    }
}

其中 B 和 C 从 A 继承。

然后我想从这段代码中调用 Base 的 handleObject :

//...
Sub s = new Sub();
A[] obj = {new B(), new B(),new C(), new A()};
for(A o:obj){
    s.handleObject(o);
}
//...

我希望 Sub.handleObject(B b) 为 B 类型的每个对象调用,Sub.handleObject(C c) 为 C 类型的每个对象调用,Base.handleObject(A a) 为 A 类型的对象调用。

真正的结果是它打印了三遍“A”。

是否可以使用 java 的重载功能使其工作,或者我必须自己键入检查每个对象?如果不是,实现所需行为的最佳实践是什么?

这个问题与我的非常相似,但答案只说明了为什么他的尝试没有奏效并且没有为我提供足够的解决方案。

我也尝试过使用Visitor Pattern使其工作,但在他们的示例中,Base 类(或至少是接口)似乎需要了解 Sub,这是我不希望拥有我的项目的东西。

4

1 回答 1

1

我建议您使用多态性来发挥自己的优势。与其试图找出不同类对象的行为方式,不如让每个类提供自己的行为:

class A {
  public void handleMyself() {
    System.out.println("A");
  }
}

class B extends A {
  @Override
  public void handleMyself() {
    System.out.println("B");
  }
}

class C extends A {
  @Override
  public void handleMyself() {
    System.out.println("C");
  }
}

class Base {
  public void handleObject(A a) {
    a.handleMyself();
  }
}

class Sub extends Base {
  public static void main(String... args) {
    Sub s = new Sub();
    A[] obj = {new B(), new B(), new C(), new A()};
    for (A o : obj) {
      s.handleObject(o);
    }
  }
}
于 2017-04-27T18:00:21.700 回答