C#:让多个类共享另一个类的同一个实例

4
有没有办法让多个类共享另一个类的实例?
在我的c#程序中,我有三个类Gamelogic(A),FPSController(B)和SpawnPlayer(C)。
在我的情况下,B和C类会使用并改变A中的一些变量,为了使用这些变量,我目前正在两个不同的类中实例化A,然后使用点符号从A的实例中访问变量,但问题是,在不同的类中实例化A之后,实例.变量的更改根本不在B和C类之间共享。
静态类型是否是解决这个问题的好方法?还是编写一个main函数会更好?
任何建议都将不胜感激。

如果您能展示您当前的代码,那将非常棒。目前我认为我理解了您的问题,但我不确定。 - Enigmativity
4个回答

5

有几种方法。这里介绍其中一种:

一种方法是使用依赖注入。 您可以将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是一种不错的方法。上下文对象充当我们的包装器。如果需要在它们之间共享多个变量(共享/全局状态),则上下文对象变得更加有用-请参见“上下文模式”。示例:
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的当前版本(而且可能更加线程安全)。


3
似乎您只需要每个类的一个实例,并在它们之间传递数据。有几种方法可以实现这一点。
静态类是其中一种方法,然后您只需在FPSControllerSpawnPlayer中访问/设置Gamelogic.Property即可。
另一种方法是在创建FPSControllerSpawnPlayer时将Gamelogic的实例传递给它们。
但是,这两种方法都会以可能使未来的更改变得困难的方式将您的类耦合在一起。
第三种方法是使所有三个类独立,并使用事件来更改变量的值并通知其他类对这些变量的更改。然而,这可能会为您的游戏引入一些滞后,因为无法保证事件按您期望的顺序处理。

1
我能想到两种方法,一种是为给定的类实现“单例模式”,这将确保在任何给定时间只存在一个实例,并且您可以自由地在任何地方使用它,从而实现您的目的。请查看Jon Skeet的link
如果“单例”不是一个选项,那么创建一个工厂,在其中传递一个键,并为给定的键确保只返回相同的对象,因为您可以在内部将对象存储在字典中,这将始终返回相同的对象,并且您仍然可以创建多个对象,与“单例”不同。

-2

展示一下,这是我的代码。

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);
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接