所以我想为我正在做的某些项目提供一个Neuroevolution库,现在我想使我的代码抽象和通用,以便可以按需要使用它。
为此,我使我的DNA类抽象化,现在遇到了交叉函数的问题,该函数返回具有新基因的自身新实例。
DNA additiveCrossover(DNA partner) {
List<T> childGenes = new ArrayList<>();
for(int i = 0; i < genes.size(); i++){
childGenes.set(i, (addGenes(genes.get(i), (T) partner.getGene(i)));
}
return new DNA(childGenes);
}
这以前可以使用,因为我的课程不是抽象的,但是现在我需要找到一种解决方法。
我不想将此方法抽象化,因为该代码在该类的所有实现中都应该相同,并且我不能仅仅使该类不抽象,因为它具有抽象方法。
是否可以实例化抽象类,以便它创建其子级的实例?
我唯一的解决方案是像这样的肮脏抽象方法:
public class DNA <T> {
public abstract DNA createFromGenes(List<T> genes);
}
public class DNAImplementation {
@Override
public DNA createFromGenes(List<T> genes){
return new DNAImplementation(genes);
}
}
我真的不喜欢这样,因为它似乎是不必要的代码,而且看起来很糟糕。
我们将不胜感激。