2016-03-05 53 views
2

调用一个方法,所以我大概得到这个:C#从对象

public partial class Form1 : Form 
{ 
    GameEngine engine; 
    public Form1() 
    { 
     engine = new GameEngine(); 
    } 

    public void repaint() 
    { 

    } 
} 

class GameEngine 
{ 
    public void update() 
    { 

    } 
} 

现在,我想补充一点的update()方法,这使得它调用重绘()方法,该实例的内Form1类,其中GameEngine类的相应对象已创建。

在java中我可能已经做了这样的

 engine = new GameEngine() 
     { 
      public void repaintCaller() 
      { 
       repaint(); 
      } 
     }; 

,并调用repaintCaller()在update()方法,但是,这并不在C#中的工作,就是现在的equilvalent的方式做这在C#中?有它

+0

我觉得你的问题是有点反对票的面向对象原则为C#。你可以给GameEngine一个Form的引用,但是我认为这会是糟糕的设计。有一个连接它们的第三个类似乎更明智 – misha130

回答

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(); 
    } 
} 
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是一种将参数传递给被调用方法(更新)的方法(repaint)。当然,您可以将整个Form1实例传递给更新,但是此方法将GameEngine类绑定到Form1类。使用Action方法,您可以不受此耦合的影响,并且可以传递任何其他返回void的方法,并且不会在程序的任何类中定义任何参数。这将释放您的GameEngine.update方法,从任何特定的绑定到调用者。

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#。 我只是希望这将有助于一点:)

+0

你为什么使用ref关键字传递表单的任何原因? – Steve

0

您还可以设置活动从形式,像这样:

public partial class Form1 : Form 
{ 
    GameEngine engine; 

    public Form1() 
    { 
     InitializeComponent(); 
     engine = new GameEngine(); 
     engine.repaintRequired += engine_repaintRequired; 
     engine.update(); 
    } 

    private void engine_repaintRequired(object sender, EventArgs e) 
    { 
     repaint(); 
    } 

    public void repaint() 
    { 
     Console.Write("repaint"); 
    } 
} 

class GameEngine 
{ 
    public event EventHandler repaintRequired; 

    public void update() 
    { 
     onRepaintRequired(); 
    } 

    private void onRepaintRequired() 
    { 
     if (repaintRequired != null) 
      repaintRequired(this, new EventArgs()); 
    } 
}