2016-03-05 31 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()); 
    } 
}