Gosu中用enum替代switch case遇编译错误,如何正确实现?
Gosu枚举替代Switch Case的正确实现方式
首先得明确:Gosu不支持Java那种在枚举常量内部直接实现抽象方法的语法,这就是你写的代码报unexpected token public的原因。不过我们可以用Gosu的闭包特性来实现你想要的“每个枚举状态对应不同行为”的逻辑,完美替代switch case。
方案一:给枚举添加行为闭包属性
这是最贴合你需求的实现方式,把每个状态对应的操作封装成闭包,注入到枚举常量中,然后提供统一的方法执行该行为:
enum Status { // 每个枚举常量传入对应的行为闭包 INACTIVE( -> { print("执行INACTIVE对应的操作") // 这里写你的具体业务逻辑 } ), ACTIVE( -> { print("执行ACTIVE对应的操作") // 这里写你的具体业务逻辑 } ), UNKNOWN( -> { print("执行UNKNOWN对应的操作") // 这里写你的具体业务逻辑 } ) // 存储每个枚举对应的行为 private var _action: ()->void // 构造函数,初始化时传入闭包 constructor(action: ()->void) { _action = action } // 对外提供统一的执行方法 public function doSomething(): void { _action() } }
调用方式
现在你完全可以替代原来的switch逻辑,直接调用枚举的方法即可:
var currentState = getState() currentState.doSomething()
为什么这个方案可行?
Gosu对闭包的支持非常友好,这种方式既保留了枚举的类型安全,又实现了“不同状态不同行为”的逻辑,而且代码比switch更简洁、更易维护——如果后续要新增状态,只需要在枚举里添加新的常量和对应的闭包即可,不需要修改调用处的代码。
补充:如果行为需要参数怎么办?
如果你的操作需要传入参数,只需要调整闭包的签名即可,比如:
enum Status { INACTIVE( (param: String) -> { print("INACTIVE操作,参数:${param}") } ), // ...其他枚举常量 private var _action: (String)->void constructor(action: (String)->void) { _action = action } public function doSomething(param: String): void { _action(param) } }
内容的提问来源于stack exchange,提问作者forgetaboutme
相关产品推荐
相关产品推荐

