有没有办法让多个类共享另一个类的同一个实例? 所以在我的c#程序中,我有三个类Gamelogic(A),FPSController(B)和SpawnPlayer(C)。
在我的情况下,类B和C将使用和更改A中的一些变量,以便使用我当前在两个不同类中实例化A的变量,然后使用点表示法从A的实例访问变量,但问题是在不同类中实例化A之后,instance.variable中的更改根本不在B和C类之间共享。
静态类型是解决这个问题的好方法吗?或者写一个主要会更好。
任何建议将不胜感激。
答案 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.Property
和FPSController
中的每一个中访问/设置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);
}
}