Ho una classe astratta abstract class MathFunc
che viene utilizzata per implementare le funzioni matematiche Rastrigin, Griewangk e Rosenbrock nelle loro classi specifiche final class Rastrigin extends MathFunc
, final class Griewangk extends MathFunc
e final class Rosenbrock extends MatjFunc
.
Questa gerarchia di classi e il modo in cui sono definiti finora funziona in modo impeccabile, quindi penso che non sia necessario cercare miglioramenti in quest'area.
Ora devo implementare un'altra classe Generation
che avrà del ArrayLists
in esso, ma il fatto è che ho bisogno di avere un'implementazione Generation per ogni funzione matematica sopra descritta.
Quindi ho bisogno di qualcosa del tipo:
ArrayList<Rastrigin> rast = new ArrayList<>();
ArrayList<Griewangk> grie = new ArrayList<>();
ArrayList<Rosenbrock> rose = new ArrayList<>();
All'interno di questi elenchi ho alcuni oggetti Rastrigin / Griewangk / Rosenbrock che ho bisogno di istanziare.
So dai progetti precedenti in C ++ che posso usare i modelli per specificare un tipo di dati generico e penso che questa sia la mia soluzione. La mia implementazione finora è simile a questa:
public class Generation <MathFunc> {
private final ArrayList<MathFunc> pop = new ArrayList<>();
private final ArrayList<MathFunc> nextpop = new ArrayList<>();
private final ArrayList<MathFunc> Crossover = new ArrayList<>();
Generation(MathFunc tp)
{
for(int i = 0; i < PopSize; i++)
{
pop.add(tp);
}
}
}
Ma il problema è: posso usare la classe astratta per istanziare gli oggetti che si basano su di essa? C'è un altro modo per farlo? Sono abbastanza confuso sull'uso dei template.
Ma fare Generation(Mathfunc tp)
mi sembra un po 'strano dal momento che le classi astratte non sono istantanee.