Java 创建与子类相同类型的对象
我正在设计一个遗传算法库,目前正在构建基因组类。这个类包括几个用于创建、突变、杂交和评估基因组的方法,并且将是这个库的核心。这个抽象类有两个子类StaticGenome和VariableGenome。这些类为固定或可变长度的基因组提供了额外的功能 最终,任何两个基因组的杂交都应该独立于基因组类型。也就是说,singlePointCrossoverGenome parent2方法接收两个基因组,并返回一个新的基因组对象,它是两个父基因组的特殊组合。然而,因为Genome是一个抽象类,所以我不能将一个新的Genome对象实例化为它的后代 如何从超类返回与子类相同类型的新对象 如蒙协助,将不胜感激 基因组类别: 两个子类:Java 创建与子类相同类型的对象,java,inheritance,types,subclass,superclass,Java,Inheritance,Types,Subclass,Superclass,我正在设计一个遗传算法库,目前正在构建基因组类。这个类包括几个用于创建、突变、杂交和评估基因组的方法,并且将是这个库的核心。这个抽象类有两个子类StaticGenome和VariableGenome。这些类为固定或可变长度的基因组提供了额外的功能 最终,任何两个基因组的杂交都应该独立于基因组类型。也就是说,singlePointCrossoverGenome parent2方法接收两个基因组,并返回一个新的基因组对象,它是两个父基因组的特殊组合。然而,因为Genome是一个抽象类,所以我不能将一
public class StaticGenome<ElementType> extends Genome<ElementType> {
}
public class VariableGenome<ElementType> extends Genome<ElementType> {
}
以及我用于测试的主要方法:
public static void main(String [] args){
Genome<IntegerElement> genomeA = new StaticGenome<IntegerElement>("Genome A", 50);
Genome<IntegerElement> genomeB = new StaticGenome<IntegerElement>("Genome B", 50);
Genome<IntegerElement> offspring = genomeB.uniformCrossover(genomeA.elementCrossover(genomeA.multiPointCrossover(genomeB, 3)));
offspring.setName("Offspring");
System.out.println(offspring);
}
我认为你需要在Genome和Static/VariableGenome类之间再引入一个类。我不是微生物学专家,所以不能推荐一个好的逻辑名称给它。但是如果您有一个新的子类,比如说您的基因组的newGenomeClass,并充当静态/VriablGenome类的父类,那么您可以使用如下方法:
public newGenomeClass singlePointCrossover(newGenomeClass parent1,newGenomeClass parent2).
希望有帮助 我认为您需要在基因组和静态/可变基因组类之间再引入一个类。我不是微生物学专家,所以不能推荐一个好的逻辑名称给它。但是如果您有一个新的子类,比如说您的基因组的newGenomeClass,并充当静态/VriablGenome类的父类,那么您可以使用如下方法:
public newGenomeClass singlePointCrossover(newGenomeClass parent1,newGenomeClass parent2).
希望有帮助 您可以从重写的方法返回一个子类,它称为co-variant返回类型
abstract class Genome {
abstract Genome singlePointCrossover(Genome parent2);
}
class StaticGenome extends Genome {
@Override
StaticGenome singlePointCrossover(Genome parent2) {
...
}
}
class VariableGenome extends Genome {
@Override
VariableGenome singlePointCrossover(Genome parent2) {
...
}
}
您可以从重写的方法返回一个子类,它称为co-variant返回类型
abstract class Genome {
abstract Genome singlePointCrossover(Genome parent2);
}
class StaticGenome extends Genome {
@Override
StaticGenome singlePointCrossover(Genome parent2) {
...
}
}
class VariableGenome extends Genome {
@Override
VariableGenome singlePointCrossover(Genome parent2) {
...
}
}
您可以将以下方法引入抽象类并在子类中实现它
protected abstract Genome<ElementType> newInstance(String name, List<AbstractGenomeElement<ElementType>> elements);
当子类实现这一点时,它们可以返回正确的实例。i、 e:他们自己的一个新例子。在交叉方法中,您可以调用此方法而不是执行“新基因组”您可以将以下方法引入抽象类并在子类中实现它
protected abstract Genome<ElementType> newInstance(String name, List<AbstractGenomeElement<ElementType>> elements);
当子类实现这一点时,它们可以返回正确的实例。i、 e:他们自己的一个新例子。在您的交叉方法中,您可以调用此方法而不是执行“新基因组”如果我是正确的,问题是:给定某个基因组对象,它将是抽象类Genome的某个子类,我们如何实例化该子类的新实例 嗯,我不知道这是否是最好的方法,但这是我想到的:
public Genome<ElementType>
multiPointCrossover(Genome<ElementType> genome2, int crosses){
// Snip...
Genome g;
try {
g = genome2.getClass()
.getConstructor(String.class, List.class)
.newInstance();
} catch (Exception e) {
// Can throw quite a few exceptions...
}
return g;
}
注意:我认为devblanked的解决方案更干净,更易于使用。这正是我在他们发布时想到的。如果我是正确的,问题是:给定某个基因组对象,它将是抽象类基因组的某个子类,我们如何实例化该子类的新实例 嗯,我不知道这是否是最好的方法,但这是我想到的:
public Genome<ElementType>
multiPointCrossover(Genome<ElementType> genome2, int crosses){
// Snip...
Genome g;
try {
g = genome2.getClass()
.getConstructor(String.class, List.class)
.newInstance();
} catch (Exception e) {
// Can throw quite a few exceptions...
}
return g;
}
注意:我认为devblanked的解决方案更干净,更易于使用。这正是我在他们发帖时想到的。读了上面的帖子,我发现基因组只能有两种类型:静态基因组和可变基因组。现在,当你想要返回一个基因组时,它将是这两种类型中的任何一种。对吗?我想是的。目前,我没有任何其他的基因组实现方案,但我可以想象,有人可能想要创建一个新的子类2DGenemy或其他具有附加功能的东西。阅读上述文章,我可以看到基因组只能有两种类型:StaticGenome和VariableGenome。现在,当你想要返回一个基因组时,它将是这两种类型中的任何一种。对吗?我想是的。目前,我还没有考虑任何其他的基因组实现,但我可以想象有人可能想要创建一个新的子类2DGenemy或其他具有附加功能的东西。问题是,不管可变长度或静态长度,交叉都是一样的。所以我想把代码放在Genome类中,这样我就不会复制代码不像接口,抽象类可以包含非静态和最终的字段,它们可以包含实现的方法。让Genome成为一个抽象类,但不要让singlePointCrossover抽象。是的,我刚刚意识到我完全错过了你的问题——实际的问题,对不起:问题是,不管可变长度还是静态长度,交叉都是一样的。所以我想把代码放在Genome类中,这样我就不会复制代码不像接口,抽象类可以包含非静态和最终的字段,它们可以包含实现的方法。使基因组成为一个抽象类,但不要
不要把单点交叉抽象化。是的,我刚刚意识到我完全错过了你的问题——实际上的问题,对不起: