如何强制Java动态方法调用绑定

如何强制Java动态方法调用绑定,java,dynamic,polymorphism,Java,Dynamic,Polymorphism,可能重复: 我不能肯定我的标题是正确的,但如果不是,我肯定我会被更正 我正在尝试重载helpIt方法,如下所示: class Animal{} class Dog extends Animal{} class Foo implements AnimalHelper { @Override public void helpAnAnimal( Animal a ) { helpIt( a ); } private void helpIt( Dog d ) {}

可能重复:

我不能肯定我的标题是正确的,但如果不是,我肯定我会被更正

我正在尝试重载helpIt方法,如下所示:

class Animal{}
class Dog extends Animal{}

class Foo implements AnimalHelper
{
  @Override
  public void helpAnAnimal( Animal a )
  { 
    helpIt( a );
  }

  private void helpIt( Dog d )
  {}

  private void helpIt( Animal a )
  {}
}
问题是,即使动物是狗,这种方法也从不调用helpIt(dogd)方法。 我使用这种方法是因为类Foo覆盖了AnimalHelper的helpAnAnimal方法

我是不是遗漏了什么?我希望我不必先检查instanceof,然后再对其进行转换。
我相信这在.Net中是开箱即用的,但内存有点褪色,可能不正确。

您不能这样做,因为Java在编译时将它们都视为动物

您可以添加特定于实际狗类的动物/狗算法,例如:

class Animal {

    protected boolean hasRabies() {
        return animal.name.equals("Tim");
    }
}

class Dog {

    @Override
    protected boolean hasRabies() {
        return false; // Apparently dogs can't have rabies?
    }
}
然后可以在helpAnimal中调用这些特定方法:

private void helpIt(Animal a) {
    if (a.hasRabies()) {
        a.setTreats(4000);
    } else {
        a.setTreats(3000);
    }
}

我不是兽医。

您不能这样做,因为Java在编译时将它们都视为动物

您可以添加特定于实际狗类的动物/狗算法,例如:

class Animal {

    protected boolean hasRabies() {
        return animal.name.equals("Tim");
    }
}

class Dog {

    @Override
    protected boolean hasRabies() {
        return false; // Apparently dogs can't have rabies?
    }
}
然后可以在helpAnimal中调用这些特定方法:

private void helpIt(Animal a) {
    if (a.hasRabies()) {
        a.setTreats(4000);
    } else {
        a.setTreats(3000);
    }
}
我不是兽医。

helpIt()
方法作为
动物的可重写实例方法:

class Foo implements AnimalHelper {
    @Override
    helpAnAnimal(Animal a) { 
        a.helpIt();
    }
}
或使用:

使
helpIt()
方法成为
Animal
的可重写实例方法:

class Foo implements AnimalHelper {
    @Override
    helpAnAnimal(Animal a) { 
        a.helpIt();
    }
}
或使用:

这里有几件事:

  • Java肯定不会调用
    helpIt(Dog d)
    方法,因为变量
    a
    的类型是
    Animal
    。您必须手动检查并调用正确的方法。这确实是一个类型向下/向上转换的情况。但对.Net不太清楚

  • 福应该是什么?它是一个助手类吗?如果是这样,我就不会实现接口,我会放弃构造函数,将私有方法公开。这样,您就可以直接使用它们,避免手动铸造

  • 或者,Java是一种面向对象的语言,因此如果
    helpIt
    Animal
    的行为,我会将该方法移到Animal类中,并一起删除helper类

    • 这里有几点:

      • Java肯定不会调用
        helpIt(Dog d)
        方法,因为变量
        a
        的类型是
        Animal
        。您必须手动检查并调用正确的方法。这确实是一个类型向下/向上转换的情况。但对.Net不太清楚

      • 福应该是什么?它是一个助手类吗?如果是这样,我就不会实现接口,我会放弃构造函数,将私有方法公开。这样,您就可以直接使用它们,避免手动铸造

      • 或者,Java是一种面向对象的语言,因此如果
        helpIt
        Animal
        的行为,我会将该方法移到Animal类中,并一起删除helper类

        • 您是否从同一类的方法调用helpIt(Dog d)

          请注意,您已对这些方法使用了private,因此无法在此类之外使用这些方法。

          您是否从同一类的方法调用helpIt(Dog d)


          请注意,您已将private用于这些方法,您将无法在此类之外使用这些方法。

          在编译时,Java将狗视为动物(请参见:)。我想您的问题在编译时已经在这里得到了回答,Java将狗视为动物(请参见:)。我想您的问题已经在这里得到了回答,谢谢。我以前从未使用过它,但我喜欢visitor模式,因为它将功能保留在我想要的地方,并允许多种实现。谢谢。我以前从未使用过它,但我喜欢visitor模式,因为它将功能保留在我想要的地方,并允许多种实现。