2013-12-11 168 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