如何有效地将信息从 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
}
}
}
}
我有一个程序,它有许多 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
}
}
}
}