【发布时间】:2011-09-09 00:00:34
【问题描述】:
如果有帮助,以下问题是在我正在构建的游戏的背景下进行的。
在几个不同的地方,我有以下场景。存在一个父类,对于这个名为 Skill 的示例,我有许多子类实现父类中的方法。还有另一个父类,我们称之为 Vocation。这些技能需要在不同的职业子类中列出。但是,这些技能需要适用于游戏中使用任何给定职业的任何事物。
我当前的设置是有一个名为 Skill.Id 的 Enum,以便 Vocation 包含来自该 Enum 的值的集合,并且当游戏中的实体采用该 Vocation 时,该集合被传递到另一个名为 SkillFactory 的类中。每次我创建一个新的 Skill 子类时,Skill.Id 都需要一个新条目,以及新子类的构造函数的 switch 块中的一个案例。
即:
//Skill.Id
Enum{FireSkill,WaterSkill,etc}
//SkillFactory
public static Skill Create(Skill.Id id)
{
switch(id)
{
case Skill.Id.FireSkill:
return new FireSkill();
//etc
}
}
这工作得非常好,但是使用枚举和 switch 块作为一个过渡感觉比我解决这个问题所需的开销更大。有没有更优雅的方法来创建这些技能子类的实例,但仍然允许职业包含一个标识它可以使用的技能的集合?
编辑:只要 Vocation 可以包含一个允许任意实例化 Skill 子类的集合,我就可以扔掉枚举和相关的 switch 块。
【问题讨论】:
-
Switch 和逻辑 if 语句非常快,除了几乎每个工厂实现(我见过)都使用 switch 做同样的事情。恕我直言,我不会改变它。
-
我同意这一点,前提是您没有在类型内的多个例程之间重复切换。此时,字典查找通常是更好的方法,因为您可以将“开关”放在代码中的单个位置。
-
这是最快最易读的方式,为什么还要另寻他法?
-
我不担心 switch 块和枚举的任何开销性能。我担心信息的重复(新的子类实现不仅需要实现,还需要新的 Skill.Id 条目和随后的 SkillFactory 案例语句)表明我的方法可能会更好。
标签: c# enums xna switch-statement