Java создание экземпляра дочернего класса в абстрактном суперклассе
Так что я пытаюсь сделать библиотеку Neuroevolution для некоторых проектов, которые я делаю, и теперь я хочу сделать свой код абстрактным и универсальным, чтобы я мог использовать его любым способом, в котором я нуждаюсь.
Для этого я сделал свой класс ДНК абстрактным и теперь сталкиваюсь с проблемами с моей функцией кроссовера, которая возвращает новый экземпляр себя с новыми генами.
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);
}
}
Мне действительно не нравится это, потому что это на вид ненужный код и выглядит ужасно.
Помощь действительно будет оценена.