Итак, я пытаюсь создать библиотеку 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);
}
}
Мне действительно это не нравится, потому что это на первый взгляд ненужный код и выглядит ужасно.
Справка будет очень признательна.