c#从对象调用方法

时间:2016-03-05 13:06:00

标签: c# object methods instance

所以我大致得到了这个:

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#中执行此操作的等价方式是什么?

4 个答案:

答案 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)
    }
}