这是来自一个更大的项目,所以我将简化结构,不包括这里涉及的所有代码,但我想知道这在概念上是否有效,如果有潜在的障碍,我可能会具有
我从主类有几个级别的子类,一个级别包含调用useEnergy()的方法age()(从顶级超类重写)。此类的直接子类重写age()。该类的直接子类需要覆盖useEnergy(),但重写方法中的代码永远不会执行(使用System.out.printlns进行验证)。有趣的是,在有类问题的类的超类中,一个覆盖age(),如果我在那里覆盖useEnergy(),那么该类的代码就会执行。 age()从对象的所有类外部调用。层次结构图看起来像这样:
这个层次结构有问题吗?有什么东西可以让Yeast中的useEnergy()中的代码在世界范围内的实体数组中的Yeast对象上调用age()时执行吗?
Organism的useEnergy()(工作)的实际代码是:
public void useEnergy(){ //Called every hungerTime, by default
energy-- ;
heat++ ;
nutrientReduction() ;
}
和Yeast中的重写方法(不工作)是:
public void useEnergy(){
Random rand = new Random() ;
super.useEnergy() ;
System.out.println("Yeast energy!") ;
if(rand.nextInt(100) < 5){
toxicity += 6 ;
emitToxins(1) ;
}
}
控制台永远不会显示“酵母能量!”即使它正确执行了Organism的useEnergy()中的代码。我还验证了AdvancedOrganism的其他子类表现出类似的行为。想法?
答案 0 :(得分:0)
感谢您的评论!事实确实如此。我自己也说服了,因为在Yeast构造函数中,有正确传递的特定于类的设置(如名称String),但我通过每个返回副本的超类中的newCopy()方法生成新对象。使用复制构造函数的当前对象(将对象作为参数传递并复制并复制所有属性)。我没有重新定义newCopy来返回Yeast对象,而是程序使用AdvancedOrganism的newCopy方法复制了Yeast的所有属性,但实际上没有返回Yeast对象,它返回了一个AdvancedOrganism对象。酵母的属性。
之前我没有遇到过这个问题,因为AdvancedOrganism的其他子类只是一个带有一些预设变量的默认构造函数 - 没有实际的方法所以复制它们就好像它们是AdvancedOrganisms一样没有问题。
我补充说:
Yeast(Yeast parentOrganism){
super(parentOrganism.xLocation, parentOrganism.yLocation, parentOrganism.zLocation, parentOrganism) ;
}
和
public Yeast newCopy(){ //Important for SpawnRandomizer
return new Yeast(this) ;
}
现在它正常运作!