2012-04-10 18 views
5

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

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

しかし、私はC#でこれを行う方法を見つけ出すことはできません。私は一般的なC#の代理人(例えば、here)について少しは読んだことがありますが、私はまだ固執しています。

これを説明する例はありますか? 私はclassBのインスタンスをインスタンス化するclassAを持っています。 ClassBはメソッド(Webサービスを呼び出す)を起動し、それに応答して、classAでメソッドを起動したいと思います。

「Hello World」タイプのチュートリアルがありますので、その基本を説明してください。

+1

C#/ .NETデリゲートは、Objective-C/Cocoaデリゲートとはまったく異なる種類のものです。 – BoltClock

+0

@ BoltClock'aaUnicorn:うん、私は間違っていると思う。しかし、私はまだ上記のシナリオをどのように再現するかを理解したいと思います。 :-) – Brett

+0

「代理人」という用語は、多くのことを意味します。 C#では、 "関数ポインタを表すオブジェクト"を意味します。私はそれがあなたに何を意味するか分かりません。 – Gabe

答えて

4

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

:上記同期されることを

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デリゲートはすべてActorパターンなので、非同期です。上記の非同期化を行うには、スレッディングを掘り下げる必要があります(おそらくGoogleの "C#Thread pool"が必要です)。

+1

私はOPがAとBを逆にする必要があると思います;)Bは子供、Bは "方法"を呼び出します(Bはイベントを発生させ、Aはそれに従う) – gbianchi

+0

おそらくその場合、パターンを逆にする方法を理解できるか疑問に思う。 –

+0

私はそれをどちらかの方法で修正しました:-) –

3

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

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方法、にデリゲートを渡す尖った-のCallback方法である方法、 Callerインスタンス。

関連する問題