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