C# 让多个 class 共享另一个 class 的同一个实例
C# Let multiple class share the same instance of another class
有没有办法让多个 class 共享另一个 class 的同一个实例?
所以在我的 c# 程序中,我有三个 class Gamelogic(A)、FPSController(B) 和 SpawnPlayer(C)。
在我的例子中 class B 和 C 会使用和改变 A 中的一些变量,以便使用我当前在两个不同的 classes 中实例化 A 的变量,然后使用点从 A 的实例访问变量的符号,但问题是在 A 在不同的 classes 中实例化之后,instance.variable 中的变化根本不会在 B 和 C class 之间共享.
静态类型是解决这个问题的好方法吗?或者写一个 main 会更好。
如有任何建议,我们将不胜感激。
听起来您只需要每个 class 的一个实例并在它们之间传递数据。有几种方法可以实现这一点。
静态 classes 是一种方法,然后您只需 access/set Gamelogic.Property
在每个 FPSController
和 SpawnPlayer
.
另一种方法是在创建 Gamelogic
实例时将它们传递给 FPSController
和 SpawnPlayer
。
然而,这两种方式将您的 class 结合在一起,可能会使未来的改变变得困难。
第三种方法是使所有三个 classes 独立并使用事件来更改变量的值并通知其他 classes 这些变量的更改。但是,这可能会给您的游戏带来一些延迟,因为不能保证事件按照您期望的顺序进行。
我可以想到两种方法,要么为给定的 类 实现 Singleton pattern
,这将确保在任何给定时间只存在一个实例,并且您可以在任何地方自由使用它,从而达到你的目的。查看 Jon 双向飞碟的 link。
如果 Singleton
不是一个选项,那么创建一个工厂,在其中传递一个键,对于给定的键,确保只有相同的对象被 returned,因为您可以在内部存储该对象在 Dictionary
中,它总是 return 相同的对象,您仍然可以创建多个对象,这与 Singleton
不同
有几种方法。这是一个:
一种方法是依赖注入。
您可以将 A 的实例传递给 B 和 C 的构造函数(或传递给 B 和 C 的 setter/property):
A a = new A();
B b = new B(a);
C c = new C(a);
但这不允许您轻松更改两个对象中的 A 引用,这似乎是您的问题。
轻松更改引用的一种方法是以某种方式将引用包装在另一个对象中。
执行此操作的一个好方法是创建一个上下文对象并将该上下文对象传递给 B 和 C,而不是传递给 A。上下文对象充当我们的包装器。如果多个变量需要在它们之间共享(shared/global 状态),则上下文对象会变得更有用 - 请参阅 "Context pattern"。示例:
public class Context {
public A a;
public ...other state you want to share...;
public Context(A a) { this.a = a; ... }
}
...
A a = new A();
Context context = new Context(a,...);
B b = new B(context);
C c = new C(context);
但是,根据您的情况,静态变量可能没问题。 (或单例)
(在某些情况下,将 A 实例传递给 B 和 C 的方法,而不是传递给它们的构造函数,可能会更好 - 然后它们也总是获得 a 的当前版本(并且可能更多线程 -安全))
显示,这是我的代码。
public interface IMyInterface
{
void SetData(String Data);
}
public partial class Form1 : Form, IMyInterface
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Form2 frm = new Form2(this as IMyInterface);
frm.Show();
}
public void SetData(String Data)
{
textBox1.Text = Data;
}
}
public partial class Form2 : Form
{
private IMyInterface frm = null;
public Form2(IMyInterface frm)
{
InitializeComponent();
this.frm = frm;
}
private void button1_Click(object sender, EventArgs e)
{
frm.SetData(textBox1.Text);
}
}
有没有办法让多个 class 共享另一个 class 的同一个实例? 所以在我的 c# 程序中,我有三个 class Gamelogic(A)、FPSController(B) 和 SpawnPlayer(C)。
在我的例子中 class B 和 C 会使用和改变 A 中的一些变量,以便使用我当前在两个不同的 classes 中实例化 A 的变量,然后使用点从 A 的实例访问变量的符号,但问题是在 A 在不同的 classes 中实例化之后,instance.variable 中的变化根本不会在 B 和 C class 之间共享.
静态类型是解决这个问题的好方法吗?或者写一个 main 会更好。
如有任何建议,我们将不胜感激。
听起来您只需要每个 class 的一个实例并在它们之间传递数据。有几种方法可以实现这一点。
静态 classes 是一种方法,然后您只需 access/set Gamelogic.Property
在每个 FPSController
和 SpawnPlayer
.
另一种方法是在创建 Gamelogic
实例时将它们传递给 FPSController
和 SpawnPlayer
。
然而,这两种方式将您的 class 结合在一起,可能会使未来的改变变得困难。
第三种方法是使所有三个 classes 独立并使用事件来更改变量的值并通知其他 classes 这些变量的更改。但是,这可能会给您的游戏带来一些延迟,因为不能保证事件按照您期望的顺序进行。
我可以想到两种方法,要么为给定的 类 实现 Singleton pattern
,这将确保在任何给定时间只存在一个实例,并且您可以在任何地方自由使用它,从而达到你的目的。查看 Jon 双向飞碟的 link。
如果 Singleton
不是一个选项,那么创建一个工厂,在其中传递一个键,对于给定的键,确保只有相同的对象被 returned,因为您可以在内部存储该对象在 Dictionary
中,它总是 return 相同的对象,您仍然可以创建多个对象,这与 Singleton
有几种方法。这是一个:
一种方法是依赖注入。 您可以将 A 的实例传递给 B 和 C 的构造函数(或传递给 B 和 C 的 setter/property):
A a = new A();
B b = new B(a);
C c = new C(a);
但这不允许您轻松更改两个对象中的 A 引用,这似乎是您的问题。 轻松更改引用的一种方法是以某种方式将引用包装在另一个对象中。
执行此操作的一个好方法是创建一个上下文对象并将该上下文对象传递给 B 和 C,而不是传递给 A。上下文对象充当我们的包装器。如果多个变量需要在它们之间共享(shared/global 状态),则上下文对象会变得更有用 - 请参阅 "Context pattern"。示例:
public class Context {
public A a;
public ...other state you want to share...;
public Context(A a) { this.a = a; ... }
}
...
A a = new A();
Context context = new Context(a,...);
B b = new B(context);
C c = new C(context);
但是,根据您的情况,静态变量可能没问题。 (或单例)
(在某些情况下,将 A 实例传递给 B 和 C 的方法,而不是传递给它们的构造函数,可能会更好 - 然后它们也总是获得 a 的当前版本(并且可能更多线程 -安全))
显示,这是我的代码。
public interface IMyInterface
{
void SetData(String Data);
}
public partial class Form1 : Form, IMyInterface
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Form2 frm = new Form2(this as IMyInterface);
frm.Show();
}
public void SetData(String Data)
{
textBox1.Text = Data;
}
}
public partial class Form2 : Form
{
private IMyInterface frm = null;
public Form2(IMyInterface frm)
{
InitializeComponent();
this.frm = frm;
}
private void button1_Click(object sender, EventArgs e)
{
frm.SetData(textBox1.Text);
}
}