2016-03-05 7 views
2

Так что я грубо получил это:C# Вызов метода из объекта

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

    public void repaint() 
    { 

    } 
} 

class GameEngine 
{ 
    public void update() 
    { 

    } 
} 

Теперь я хочу кое-что добавить к методу обновления(), что делает его вызвать метод перекрасить(), внутри этого экземпляра класс Form1, в котором был создан соответствующий объект класса GameEngine.

В Java я мог бы сделать это как этот

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

и вызвать метод repaintCaller() в обновлении(), но это не работает в C#, что теперь является equilvalent способ сделать это в C#?

+0

Я думаю, что ваш вопрос является своим родом againts в объектно-ориентированных принципах, который является C#. Вы можете дать GameEngine ссылку на форму, но я думаю, что это будет плохой дизайн. Наличие третьего класса, который соединяется между ними, кажется более мудрым – 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(); 
    } 
} 

parameterless Action delegate в C# является способ передать, как параметр, метод (перерисовать) вызванному методу (update). Конечно, вы можете передать весь экземпляр 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()); 
    } 
} 
Смежные вопросы