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

时间:2016-03-26 12:23:47

标签: c# class instance

有没有办法让多个类共享另一个类的同一个实例? 所以在我的c#程序中,我有三个类Gamelogic(A),FPSController(B)和SpawnPlayer(C)。

在我的情况下,类B和C将使用和更改A中的一些变量,以便使用我当前在两个不同类中实例化A的变量,然后使用点表示法从A的实例访问变量,但问题是在不同类中实例化A之后,instance.variable中的更改根本不在B和C类之间共享。

静态类型是解决这个问题的好方法吗?或者写一个主要会更好。

任何建议将不胜感激。

4 个答案:

答案 0 :(得分:4)

有几种方法。这是一个:

一种方式是依赖注入。 您可以将A的实例传递给B和C的构造函数(或者传递给B和C的setter / property):

A a = new A();
B b = new B(a);
C c = new C(a);

但是这并不允许您轻松更改两个对象中的A引用,这似乎是您的问题。 一种轻松更改引用的方法是以某种方式将引用包装在另一个对象中。

这样做的好方法可能是创建一个Context对象并将该上下文对象传递给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的当前版本(并且可能更加线程安全) )

答案 1 :(得分:3)

听起来你只需要拥有每个类的一个实例并在它们之间传递数据。有几种方法可以实现这一目标。

静态类是一种方法,您只需在Gamelogic.PropertyFPSController中的每一个中访问/设置SpawnPlayer

另一种方法是在创建Gamelogic时将FPSController的实例传递给SpawnPlayer <head> <script type="text/javascript"> function convertToJson() { var tableData = $('#productOrder').tableToJSON({ ignoreColumns: [0] }); var xhr = new XMLHttpRequest(); xhr.open("GET","orders.php",true); xhr.setRequestHeader("Content-Type", "application/json"); xhr.send(JSON.stringify(tableData)); } </script> </head> ...more code... <button type="button" class="btn btn-success btn-md" style="float: right;" onclick="convertToJson();">Create Order</button> <div> <?php $data = json_decode(file_get_contents('php://input')); var_dump($data); ?> </div>

然而,这两种方式将您的课程结合在一起,可能会使未来的变化变得困难。

第三种方法是使所有三个类独立,并使用事件来改变变量的值,并通知其他类对这些变量的更改。但是,这可能会给您的游戏带来一些延迟,因为无法保证事件是您期望的顺序。

答案 2 :(得分:1)

我可以想到两种方法,为给定的类实现Singleton pattern,这将确保在任何给定的时间只存在一个实例,并且您可以随意使用它,从而达到您的目的。查看Jon skeet的link

如果Singleton不是一个选项,那么创建一个工厂,在那里传递一个密钥,对于给定的密钥,确保只返回相同的对象,因为你可以在Dictionary内部存储该对象。 ,它总是返回相同的对象,你仍然可以创建多个对象,而不像Singleton

答案 3 :(得分:-1)

显示,这是我的代码。

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