2013-12-11 210 views
0

內T形我有一個用於實現其特定類final class Rastrigin extends MathFuncfinal class Griewangk extends MathFuncfinal class Rosenbrock extends MatjFunc數學函數Rastrigin,Griewangk和的ROSENBROCK一個抽象類abstract class MathFunc如何實例化一個模板類

這個層次的類以及它們如何定義到目前爲止完美無缺,所以我認爲沒有必要在這個領域尋求改進。

現在我必須實現另一個類Generation,它將有一些ArrayLists在裏面,但事情是我需要有一個世代實現上述每個數學函數。 所以,我需要這樣的東西:

ArrayList<Rastrigin> rast = new ArrayList<>(); 
ArrayList<Griewangk> grie = new ArrayList<>(); 
ArrayList<Rosenbrock> rose = new ArrayList<>(); 

這些名單我有我需要實例一些Rastrigin/Griewangk /的ROSENBROCK對象中。

我從過去的C++項目中瞭解到,我可以使用模板來指定一個通用數據類型,我在想這是我的解決方案。我到目前爲止的實現如下所示:

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); 
     } 
    } 
} 

但問題是:我可以使用抽象類實例化依賴它的對象嗎?還有另一種方法可以做到嗎?我對模板的使用感到困惑。

但做Generation(Mathfunc tp)似乎有點奇怪,因爲抽象類不可實例化。

P.S. This似乎是一個可能的解決方案,但我很不確定它或它如何實際工作。

+0

你想給我們e同一'MathFunc'子類的多個實例?或者將多個相同的實例('tp')添加到列表中是否正確? – Thomas

+0

@Thomas我想添加在類型Rastrigin的10代對象或Rosenbrock類型的10個對象的列表中,但我不知道如何實例化它們。 – Edeph

+0

@Thomas請查看您對答案的評論,併爲工廠模式提供一些解釋。 – Edeph

回答

1

如果您想重複使用MathFunc的相同實例,我們在您的代碼中看不到任何主要缺陷(除Generation的通用定義應爲Generation<T extends MathFunc)。

所以先改變你的類是這樣的:

public class Generation <T extends MathFunc> { 
    private final ArrayList<T> pop = new ArrayList<>(); 
    private final ArrayList<T> nextpop = new ArrayList<>(); 
    private final ArrayList<T> Crossover = new ArrayList<>(); 

    Generation(T tp) { 
    for(int i = 0; i < PopSize; i++) { 
     pop.add(tp); 
    } 
    } 
} 

然後實例Generation這樣的:

Generation<Rastrigin> rastriginGen = new Generation<>(new Rastrigin()); 
Generation<Griewangk> griewangkGen = new Generation<>(new Griewangk()); 
Generation<Rosenbrock> rosenbrockGen = new Generation<>(new Rosenbrock()); 

如果你想使用一個MathFuncGeneration的多個實例,你可能想使用工廠模式。

Factory接口:

interface MathFuncFuncFactory<T extends MathFunc> { 
    T createFunc(); 
} 

然後加入實現比如RastriginFactory implements MathFuncFuncFactory<Rastrigin>

內代:

Generation(MathFuncFactory<T> factory) { 
    for(int i = 0; i < PopSize; i++) { 
     pop.add(factory.createFunc()); 
    } 
} 

構造函數調用:

Generation<Rastrigin> rastriginGen = new Generation<>(new RastriginFactory()); 
+0

我真的很喜歡這個答案,感謝很多人會嘗試這兩種解決方案!我真的忘了工廠模式。 – Edeph

+0

'公共接口MathFuncFactory出現了一些問題(){createFunc();} }錯誤出現在請告訴我如何修復它。 – Edeph

+0

@BartoszKP你是對的,我輸入有點太快:( – Thomas