我想避免使用带标签的类和大的if-else块或switch语句,并使用具有类层次结构的多态,而我认为这是更好的做法。创建对象和多态性
例如,类似于下面的内容,其中执行方法的选择仅依赖于类型为Actor的对象的一个字段。
switch(actor.getTagField())
{
case 1: actor.act1(); break;
case 2: actor.act2(); break;
[...]
}
将成为
actor.act();
与行为方法将在演员的子类覆盖。
然而,在运行时实例化的子类来决定最明显的方法看起来非常类似于原始:
Actor newActor(int type)
{
switch(type)
{
case 1: return new Actor1();
case 2: return new Actor2();
[...]
}
}
因此它似乎没有什么真的已经取得了;逻辑刚刚被移动。
什么是更好的方法来做到这一点?我能想出的唯一方法是为Actor的每个子类实现一个工厂类,但这对于这样一个简单的问题来说似乎相当麻烦。
我是否在推翻这个?如果我在其他地方做了几乎相同的事情,那么看起来原来的改变就没有意义了。
对不起,澄清,我想选择哪个子类在运行时实例化,而不是在编译时,如你的例子。这需要一个大开关或if-else块,我想避免这种情况。我开始认为这不是必要的,因为只有在创作时才需要它。 – flowsnake 2012-04-28 23:05:47
嗯..实际上工厂几乎没有w /编译vs运行时实例本身,而是创建Actor的责任和控制。例如,如果上述的Actor的创建发生在Event中,它是不是运行时? – 2012-04-29 00:15:27
你在做什么是“决定”集中创造Actors ..你想要演员来自一个地方,在这种情况下......你无法绕过切换......因为这是一个决定最终用户。 – 2012-04-29 00:19:24