Java создание экземпляра дочернего класса в абстрактном суперклассе - PullRequest
0 голосов
/ 11 февраля 2019

Итак, я пытаюсь создать библиотеку 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);
    }
}

Мне действительно это не нравится, потому что это на первый взгляд ненужный код и выглядит ужасно.

Справка будет очень признательна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...