如何有效地将信息从 class 传回主程序?

How to effectively relay information back from a class to the main program?

我有一个程序,它有许多 classes,我将输入信息传递给它们;为了确定我应该将输入中继到哪个 class,我有一个变量可以保持当前 class“处于焦点”,如果你愿意的话。

下面是一个伪代码来演示:

class Class1 ...
class Class2 ...

Class1 class1 = new Class1;
Class2 class2 = new Class2;

string currentClass = "class1";

KeyboardState kbstate = Keyboard.State();

switch (currentClass)
{
    case "class1":
        class1.HandleInput(kbstate);
    case "class2":
        class2.HandleInput(kbstate);
}

我想让 class 保持状态,例如Class1 有一个 属性 isActive,如果为假,将导致活动 class 转移到另一个 class(例如,Class2)-也就是说,主程序中的变量currentClass会变成class2,所以输入会被重定向到这个class。

我可以通过另一个 if 语句(在主程序中)来做到这一点,检查每个 class 中 isActive 的内容并更改 class 目前处于非活动状态,但由于我想在游戏(w/ monogame)上做,这段代码每秒将执行 60 次,这是相当浪费的。

这在现实生活中的应用是,一旦单击主菜单上的“开始游戏”按钮,从开始菜单 class 处理输入更改为 MainGame class 处理输入。

有没有人有办法在不像这样反复检查变量变化的情况下实现这个?

我也很确定这是糟糕的代码设计,但我不知道更好的方法,所以如果有人能提出更好的方法,我们将不胜感激。

提前致谢。

如果您的 class 相似,您可以查看接口甚至继承。 https://docs.microsoft.com/en-us/dotnet/csharp/tour-of-csharp/interfaces

基本上,您不需要在字符串中保存当前 class。

interface IGameClass
{
    void HandleInput();
}

class Class1: IGameClass ...
class Class2: IGameClass ...

KeyboardState kbstate = Keyboard.State();

Class1 class1 = new Class1;
Class2 class2 = new Class2;

IGameClass CurrentClass = class1; // Set this instead of string

CurrentClass.HandleInput(kbstate);

关于您的循环布尔检查,您可以使用 属性 和支持字段并在设置 isactive bool 时更改当前 class。 https://docs.microsoft.com/en-us/dotnet/csharp/properties

class Class1
{
    int _isActive;
    public bool IsActive
    {
        get
        {
            return this._isActive;
        }
        set
        {
            this._number = value;
            
            // Sample logic
            if(value)
            {   
                CurrentClass = class1;
            }
            else 
            {
                CurrentClass = class2
            }
        }
    }
}