2015-12-28 47 views
0

我有多个类从一个基类派生的多态方法接受在基类中声明的枚举类型。我重复在子类中的枚举,使每个子类只接受值都有自己的特定组:继承中的枚举

class Character { 

    enum Actions { 

    } 

    func performAction(action: Actions) { 
     // Functions to be performed by all subclasses 
    } 
} 


class Warrior: Character { 

    enum Actions { 
     case Attack, Block, Charge 
    } 

    override func performAction(action: Actions) { 
     // Add subclass-specific behavior 
    } 
} 

class Wizard: Character { 

    enum Actions { 
     case Attack, CastSpell, Run 
    } 

    override func performAction(action: Actions) { 
     // Add subclass-specific behavior 
    } 
} 

这当然不工作,我得到

“操作”是不明确的类型在这种情况下查找。

我无法删除基类中的枚举,因为那样我得到了一个未声明的方法类型错误。我有一种强烈的感觉,我正在努力去改变这一切,尝试重新发明轮子。有人能指引我朝着正确的方向吗?谢谢。

+0

您的目标是便于配置,确切的编译器检查可用性(即不支持的请求类型没有运行时错误)? – Wain

+0

@Wain我的主要目标是确保每个子类的方法只接受允许的内容。 – Shades

+0

我用枚举方法简单地定义了方法中允许的参数类型 – Shades

回答

1

如何对这种做法:

enum Action { 
    case Attack, Block, Charge, CastSpell, Run 
} 

class Character { 

    final func performAction(action: Action) { 
     if self.allowedActions().contains(action) { 
      self.executeAction(action); 
     } 
    } 

    func allowedActions() -> [Action] { 
     // to be overriden in subclasses 
     return [] 
    } 

    func executeAction(action: Action) { 
     // this will also be overriden in subclasses 
    } 
} 

class Warrior: Character { 
    override func allowedActions() -> [Action] { 
     return [.Attack, .Block, .Charge] 
    } 

    override func executeAction(action: Action) { 
     // do whatever is needed 
    } 
} 

class Wizard: Character { 
    override func allowedActions() -> [Action] { 
     return [.Attack, .CastSpell, .Run] 
    } 

    override func executeAction(action: Action) { 
     // do whatever is needed 
    } 
} 

您可以使用一个枚举来容纳所有可能的行动,你每所允许的操作子类中定义。

这样你就可以把所有的字符都看成是相同的:询问他们可以执行的动作,例如你可以显示一个菜单,然后让角色执行这个动作。

我们可以更进一步,通过使用结构而不是类和枚举的关联值,这是一个更快捷的方法,但也更复杂的设置(但更合理)。

+0

所以,如果我调用了performAction()方法,我将如何检查该操作是否被允许?我会检查数组是否包含请求的操作? – Shades

+0

是的,'performAction()'将需要检查动作是否在允许的数组内。我会更新答案来反映这一点。 – Cristik

+0

@shades - 我更新了答案,让我知道它是否澄清事情。 – Cristik