我的代码与此类似:
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);
}
//...
我希望为类型B的每个对象调用Sub.handleObject(B b),为类型C调用Sub.handleObject(C c),为类型A的对象调用Base.handleObject(A a)
真正的结果是打印" A"三次。
是否可以使用java的重载功能使其工作,还是我必须自己键入检查每个对象?如果没有,达到预期行为的最佳做法是什么?
This question与我的非常相似,但答案只显示为什么他的尝试不起作用,并没有为我提供足够的解决方案。
我也尝试使用Visitor Pattern使其工作,但在他们的示例中,似乎Base类(或至少是接口)需要知道Sub,这是我不喜欢的东西有我的项目。
答案 0 :(得分: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);
}
}
}