【问题标题】:Enum in inheritance继承中的枚举
【发布时间】:2015-12-29 03:21:38
【问题描述】:

我有多个从一个基类派生的类,这些类具有一个多态方法,该方法接受基类中声明的枚举类型。我在子类中重复枚举,以便每个子类只接受其自己的特定值组:

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
    }
}

这当然行不通,我明白了

'Actions' 对于这种上下文中的类型查找是不明确的。

我无法删除基类中的枚举,因为我得到了一个未声明的方法类型错误。我有一种强烈的感觉,我将这一切都错了,并试图重新发明轮子。有人可以指出我正确的方向吗?谢谢。

【问题讨论】:

  • 您的目标是易于配置,准确的编译器检查可用性(即不支持的请求类型没有运行时错误)?
  • @Wain 我的主要目标是确保每个子类的方法只接受允许的内容。
  • 我使用枚举方法只是为了定义方法中允许的参数类型

标签: swift oop enums


【解决方案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
    }
}

您使用一个枚举来保存所有可能的操作,并为每个子类定义允许的操作。

这样您就可以对所有角色一视同仁:询问他们可以执行的操作,例如,您可以显示一个菜单,然后要求该角色执行该操作。

我们可以走得更远,通过使用结构而不是类和枚举的关联值,这是一种更快捷的方法,但设置起来也有点复杂(但更合乎逻辑)。

【讨论】:

  • 那么,如果我调用 performAction() 方法,我将如何检查该操作是否被允许?我会检查数组是否包含请求的操作?
  • 是的,performAction() 需要检查操作是否在允许的数组中。我会更新答案以反映这一点。
  • @shades - 我更新了答案,如果它澄清了事情,请告诉我。
  • 感谢您的澄清。我会接受答案。在您看来,这对我来说是从一开始就解决这个问题的好方法吗?
  • 如果你有几个实体需要在某些情况下进行相同的处理,比如你的,多态总是好的。它将帮助您进行模块化,并使您的课程简单而简短。
猜你喜欢
  • 1970-01-01
  • 2010-10-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多