【问题标题】:What to do if you can't change an object's class dynamically?如果不能动态更改对象的类怎么办?
【发布时间】:2019-12-07 10:54:00
【问题描述】:

我正在用打字稿制作一个小足球游戏,并希望允许用户一次控制一个玩家,但他们可以切换到控制另一个玩家。我有一个包含属性和 getNextMove 方法的播放器类,无论播放器是由用户控制还是由 ai 控制,都将需要该方法。但是,我希望 getNextMove 方法根据播放器是由用户控制还是由 ai 控制来实现不同的逻辑。

我正在考虑有一个 User 类和一个 AI 类来实现 Player 类以及随后的 getNextMove 方法。

这和我想的一样

interface Player {
    ...
    getNextMove()
}

class User implements Player{
    getNextMove(){
        // Take user input
    }
}

class AI implements Player{
    getNextMove(){
        // Decide next move automatically
    }
}

但是,随着用户更改玩家,他们刚刚控制的玩家将需要切换回使用 AI 逻辑。我不认为这些类可以动态切换,我不能在这个 Object 结构之外思考或找到可以实现我想要的东西。非常感谢任何建议。

【问题讨论】:

  • 委托给一个策略。比方说,每个玩家都有一个引擎,它可以是 AIEngine 或 UserEngine。切换时,改变播放器的引擎。
  • 用你实际写作的语言思考。

标签: typescript oop inheritance


【解决方案1】:

我同意 JB Nizet 的观点。

使用strategy 模式。

class UserState {
    // properties
}

class User {
    constructor(){
        this.state = new UserState();
    }

    activateUserControl(){
        this.moveStrategy = new UserControlStrategy(this.state);
    }

    activateAI(){
        this.moveStrategy = new AIControlStrategy(this.state);
    }

    getNextMove(){
        this.moveStrategy.nextMove();
    }
}

【讨论】:

  • 漂亮,这个图案不错!
  • 我推荐你一本书《Head First Design Patterns》。您可以了解许多模式和原则。
猜你喜欢
  • 1970-01-01
  • 2016-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-18
  • 2020-11-06
  • 1970-01-01
  • 2020-03-13
相关资源
最近更新 更多