2012-04-10 15 views
5

Tengo problemas para encontrar la forma de programar las llamadas a métodos de delegado en todas las clases en C#. Vengo del mundo de Objective-C, lo que puede confundirme. En Objective-C, puedo asignar un objeto delegado dentro de una clase hija, para que sea la clase padre (es decir, childViewcontroller.delegate = self;). Entonces puedo disparar un método en la clase delegada mediante el uso de:Métodos de delegar de llamada de otra clase

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

Sin embargo, no puedo encontrar la manera de hacer esto en C#. He leído un poco sobre delegados de C# en general (por ejemplo, here), pero todavía estoy atascado.

¿Hay algún ejemplo que explique esto?

Aquí está mi caso completo: Tengo classA que crea una instancia de classB. ClassB activa un método (que llama a un servicio web), y en respuesta, me gustaría iniciar un método en la clase A.

¿Algún tipo de tutoriales de "Hello World" que puedan explicar los fundamentos de esto?

+1

Recuerda que los delegados de C#/.NET son un tipo de cosa completamente diferente de los delegados de Objective-C/Cocoa. – BoltClock

+0

@ BoltClock'saUnicorn: Sí, creo que es allí donde me estoy equivocando. Pero aún me gustaría descubrir cómo replicar el escenario anterior. :-) – Brett

+0

El término "delegado" puede significar muchas cosas. En C# significa "un objeto que representa un puntero de función". No estoy seguro de lo que significa para ti. – Gabe

Respuesta

4

En C# lo que creo que está buscando se llaman eventos. Son una función de idioma que permite que una instancia de clase exponga a un delegado público de forma que otras instancias de clase puedan suscribirse. Solo la clase expositora puede plantear el evento.

En su ejemplo:

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; } 
} 

Tenga en cuenta que lo anterior será síncrona. Tengo entendido que los delegados de Objective-C son todos patrones Actor, por lo que son asincrónicos. Para realizar el asincronizado anterior, deberás profundizar en el subprocesamiento (probablemente quieras googlear "Grupo de subprocesos C#").

+1

Creo que OP necesita A y B de la manera opuesta;) B es el niño, B "llama" Un método (por lo que B plantea el evento, Suscríbete) – gbianchi

+0

Posiblemente, en ese caso le estoy dando el beneficio del duda de que pueda descubrir cómo invertir el patrón. –

+0

Lo arreglé de cualquier manera :-) –

3

Un delegado es un objeto que apunta a un método, ya sea un método estático o de instancia. Así, por tu ejemplo, sólo se utilizaría el modelo de eventos:

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! 

La instancia Caller pasa un delegado al método de la Callee de ejemplo DoSomething, que a su vez llama al cual apunta al método, que es el método Callback de la Caller instancia.

Cuestiones relacionadas