6

C# のクラス間でデリゲート メソッド呼び出しをプログラムする方法を理解するのに苦労しています。私は Objective-C の世界から来たので、混乱するかもしれません。Objective-C では、子クラス内のデリゲート オブジェクトを親クラス (つまり、childViewcontroller.delegate = self;) に割り当てることができます。次に、次を使用して、デリゲート クラスでメソッドを起動できます。

if([delegate respondsToSelector:@selector(methodName:)]) {
   [delegate methodName:parametersgohere];
}

ただし、C# でこれを行う方法がわかりません。一般的な C# デリゲートについて少し読んだことがありますが (たとえば、こちら)、まだ行き詰まっています。

これを説明する例はありますか?

これが私のシナリオ の全容です。classB のインスタンスをインスタンス化する classA があります。ClassB が (Web サービスを呼び出す) メソッドを起動し、応答時に classA のメソッドを起動したいと考えています。

これの基本を説明する「Hello World」タイプのチュートリアルはありますか?

4

2 に答える 2

6

デリゲートは、メソッド (静的メソッドまたはインスタンス メソッド) を指すオブジェクトです。したがって、あなたの例では、イベントモデルを使用するだけです:

class Caller {
    public void Call() {
        new Callee().DoSomething(this.Callback); // Pass in a delegate of this instance
    }

    public void Callback() {
        Console.WriteLine("Callback called!");
    }
}

class Callee {
    public void DoSomething(Action callback) {
        // Do stuff
        callback(); // Call the callback
    }
}

...

new Caller().Call(); // Callback called!

Callerインスタンスは、インスタンスのメソッドにデリゲートを渡します。これにより、インスタンスCalleeのメソッドDoSomethingであるポイント先のメソッドが呼び出されます。CallbackCaller

于 2012-04-10T18:34:37.877 に答える
4

C# では、あなたが探していると思うものはイベントと呼ばれます。これらは、他のクラス インスタンスがサブスクライブできる方法で、クラス インスタンスがパブリック デリゲートを公開できるようにする言語機能です。公開クラスのみがイベントを発生させることができます。

あなたの例では:

public class ClassB {
    // Note the syntax at the end here- the "(s, e) => { }" 
    // assigns a no-op listener so that you don't have to 
    // check the event for null before raising it.
    public event EventHandler<MyEventArgs> MyEvent = (s, e) => { }

    public void DoMyWork() { 
        // Do whatever

        // Then notify listeners that the event was fired
        MyEvent(this, new MyEventArgs(myWorkResult));
    }
}

public class ClassA {
    public ClassA(ClassB worker) {
        // Attach to worker's event
        worker.MyEvent += MyEventHandler;

        // If you want to detach later, use
        // worker.MyEvent -= MyEventHandler;
    }

    void MyEventHandler(Object sender, MyEventArgs e) {
        // This will get fired when B's event is raised
    }
}

public class MyEventArgs : EventArgs {
    public String MyWorkResult { get; private set; }
    public MyEventArgs(String myWorkResult) { MyWorkResult = myWorkResult; }
}

上記は同期であることに注意してください。私の理解では、Objective-C デリゲートはすべてアクター パターンであるため、非同期です。上記の非同期を作成するには、スレッド化を掘り下げる必要があります (おそらく「C# スレッド プール」をググりたいでしょう)。

于 2012-04-10T18:32:19.877 に答える