Design per una classe template

0

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.

    
posta Edeph 11.12.2013 - 09:32
fonte

3 risposte

0

Sono riuscito a risolvere il problema come indicato qui . Sembra che lo schema di fabbrica funzioni meglio in questo scenario.

    
risposta data 11.12.2013 - 15:26
fonte
1

Per rispondere un po 'a quello che stai chiedendo: puoi usare l'abstract come tipo di dichiarazione, il tipo di riferimento, ma l'oggetto (reale) dovrebbe essere quello di un tipo concreto / implementativo. Probabilmente lo hai già capito; anzi, in questo caso, probabilmente usando le interfacce sarebbe un vantaggio.

Per ulteriori informazioni, è disponibile una bella esercitazione sul metodo del modello: link . Inoltre, ti preghiamo di leggere un po 'dell'uso dei generici Java: link .

    
risposta data 11.12.2013 - 10:46
fonte
0

Non è necessario creare un'istanza della classe Mathfun c. Invece, ciò che puoi fare è istanziare una delle sottoclassi di MathFunc e trattare l'oggetto come un'istanza di Mathfun . Ad esempio:

MathFunc math = new Rastrigin();
Generation g = new Generation(math);
    
risposta data 11.12.2013 - 10:23
fonte

Leggi altre domande sui tag