如何强制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模式,因为它将功能保留在我想要的地方,并允许多种实现。