所以我大致得到了这个:
public partial class Form1 : Form
{
GameEngine engine;
public Form1()
{
engine = new GameEngine();
}
public void repaint()
{
}
}
class GameEngine
{
public void update()
{
}
}
现在我想在update()方法中添加一些东西,这使得它调用了Form1类的实例内的repaint()方法,其中创建了GameEngine类的相应对象。
在java中,我可以像这样完成它
engine = new GameEngine()
{
public void repaintCaller()
{
repaint();
}
};
并在update()方法中调用repaintCaller(),但这在c#中不起作用,现在在c#中执行此操作的等价方式是什么?
答案 0 :(得分:0)
获得它的一种方法是:
public partial class Form1 : Form
{
GameEngine engine;
public Form1()
{
engine = new GameEngine();
engine.update(this);
}
public void repaint()
{
}
}
class GameEngine
{
public void update(Form1 form)
{
form.repaint();
}
}
答案 1 :(得分:0)
您可以将操作委托转移到GameEngine.update
方法表单实例中的repaint
方法
public partial class Form1 : Form
{
GameEngine engine;
public Form1()
{
engine = new GameEngine();
// I put the call here for demo purpose,
// of course you call the engine.update
// method when you need and where you want
engine.update(repaint)
}
public void repaint()
{
Console.WriteLine("repaint called in the Form1 instance");
}
}
class GameEngine
{
public void update(Action clientUpdate)
{
if(clientUpdate != null)
clientUpdate.Invoke();
// or just... clientUpdate();
}
}
C#中的parameterless Action delegate是一种将方法(重绘)作为参数传递给被调用方法(更新)的方法。当然,您可以将整个Form1实例传递给更新,但此方法将GameEngine类绑定到Form1类。使用Action方法,您可以从这种耦合中解脱出来,并且可以传递任何其他返回void的方法,并且不会在程序的任何类中定义任何参数。这将使您的GameEngine.update方法从与调用者的任何特定绑定中解放出来。
答案 2 :(得分:0)
我会尝试类似的东西
class GameEngine
{
public void update(ref Form1 caller)
{
caller.Refresh() //msdn says "Forces the control to invalidate its client area and immediately redraw itself and any child controls."
}
}
public partial class Form1 : Form
{
[...]
engine = new GameEngine()
engine.update(ref This)
}
我不确定任何事情,我不习惯C#。 我只是希望它会有所帮助:)
答案 3 :(得分:0)
您还可以从表单中设置事件,如下所示:
extension MyGenericType {
public convenience init(value: String, defaultValue: T) {
self.init()
print(value)
}
}