3

再会。

我有一门课,我将用它来生成用于培训目的的数学练习。该课程由一系列方法组成,每个方法生成一种类型的练习。

然后我想制作一种方法来生成一个随机类型的随机练习。为此,我想将方法​​名称存储在一个数组中,然后调用一个随机条目。

到现在为止还挺好。

由于将来我要添加方法来生成新的练习类型,我想知道是否有一种方法可以动态生成方法数组:一旦加载了类,构造函数将检查可用的方法并将他们的名字存储在一个数组中。

那可能吗?如果是这样,怎么做?

4

7 回答 7

6

您可以使用反射来发现类的方法。

但是在我看来,这是一个糟糕的架构。处理不同练习的更好方法是创建一个IExercise将由*Exercise类实现的接口。然后创建这些对象,将它们放入一个数组并随机选择一个。然后从接口或其他东西调用指定的方法......

于 2012-08-29T11:08:57.667 回答
3

您可以存储方法代理,而不是存储名称

Method[] methods = getClass().getDeclaredMethods();

您需要通过这些忽略您添加的任何非测试方法。

于 2012-08-29T11:07:23.150 回答
3

我强烈建议查找策略模式:

http://en.wikipedia.org/wiki/Strategy_pattern

您将如何将其应用于您的问题?只需创建实现通用接口的对象(为您提供创建练习的方法)并使用此对象的列表。

您还将练习一个非常有用的模式!

于 2012-08-29T11:09:40.773 回答
2

您可以使用Reflection API来检查可用的方法

 Method[] methods= Class.forName("ClassTo test").getDeclaredMethods();

话虽如此,在调用方法时有很多事情可能会出错。

你可以通过只拥有它来避免它

interface  IExercise
{
    void createExercise();
}
class Exercise1 implements IExercise
{
    @Override
    public void createExercise()
    {
    }
}

然后你可以使用随机IExercise[]生成。Exercise

于 2012-08-29T11:07:44.150 回答
1

我认为使用命令模式并将每个练习存储为实现标记接口 (ICommand) 的命令类会更安全。之后,您可以使用反射在运行时检测在类路径上实现 ICommand 的所有类,以获得可以运行的练习列表。这也将使您不必在随机选择代码的集合中添加您设计的每种新类型的练习。

http://en.wikipedia.org/wiki/Command_pattern

这有点类似于下面建议的策略模式。

于 2012-08-29T11:10:34.533 回答
0

创建对象,例如:

MathExample math = new MathExample();

并将它们添加到ArrayList<Objects>

于 2012-08-29T11:08:11.280 回答
0

我认为,最好在数组中创建责任链和 stro 命令。随机选择命令并放入链中。

于 2012-08-29T11:11:07.123 回答