Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用子类参数重载子类(java)_Java_Inheritance_Dynamic Dispatch - Fatal编程技术网

使用子类参数重载子类(java)

使用子类参数重载子类(java),java,inheritance,dynamic-dispatch,Java,Inheritance,Dynamic Dispatch,我的代码与此类似: 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 Sys

我的代码与此类似:

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),对类型C调用Sub.handleObject(C),对类型A的对象调用Base.handleObject(A)

真正的结果是它打印“A”三次

是否可以使用java的重载功能使其工作,或者我必须自己对每个对象进行类型检查?如果没有,实现预期行为的最佳实践是什么

与我的非常相似,但答案只能说明为什么他的尝试没有成功,也没有为我提供足够的解决方案


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

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

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);
    }
  }
}

重载根本不适用于此,不适用。重载只适用于编译时已知的类型。请参阅。重写是运行时的,重载是编译时的。总的来说,您似乎误用了继承。继承意味着扩展项是父类型的一种情况。试图让父类型包含子类型的特定知识​ 循环依赖:子类型显然必须依赖于依赖于子类型的超类型。不要那样做。回去想想你的对象模型到底是什么。@LewBloch我不认为我有一个超类对一个子类的依赖关系,你能告诉我你看到的问题吗?A可以在没有B和C的情况下工作(这是A的更具体的情况),Base可以在没有sub的情况下工作。您要求
A
根据
A
的子类型的参数类型的编译时知识对方法参数有不同的行为。不幸的是,这在我的情况下没有意义。Sub的不同实例应该以不同的方式处理相同的A/B/C实例,这样A/B/C就没有共同的动作。我将试图澄清这个问题,让我用一个更真实的用例来充实我的解决方案