¿Por qué no puedo agregar un delegado a mi interfaz?¿Por qué no puedo poner un delegado en una interfaz?
Respuesta
A Delegate es un type que no se puede declarar en una interfaz. Es posible que desee utilizar un evento (si corresponde) o declarar un delegado fuera de la interfaz, pero en el mismo espacio de nombres.
Este enlace puede Ayuda- When to Use Delegates Instead of Interfaces
Un delegado es simplemente otro tipo, por lo que no se gana nada al ponerlo dentro de la interfaz.
No debería necesitar crear sus propios delegados. La mayoría de las veces debe usar EventHandler, Func, Predicate o Action.
¿Puedo preguntar cómo es tu delegado?
No veo por qué alguien establecer un voto negativo ... – eglasius
Esta respuesta en realidad también resolvió mi problema que nunca pude encontrar una buena manera de utilizar delegados en las situaciones en las que quería usarlos. Es decir. no use 'm :). –
Puede utilizar cualquiera de estos:
public delegate double CustomerDelegate(int test);
public interface ITest
{
EventHandler<EventArgs> MyHandler{get;set;}
CustomerDelegate HandlerWithCustomDelegate { get; set; }
event EventHandler<EventArgs> MyEvent;
}
¿Por qué crear CustomerDelegate cuando puede usar Func
que sé, sólo estaba ilustrando que se puede utilizar casi cualquier cosa :) – eglasius
Se hace difícil entender como parámetros Func
La documentación dice claramente que se puede definir un delegado en una interfaz:
Una interfaz contiene sólo los firmas de los métodos, los delegados o eventos.
MSDN: interface (C# Reference)
Sin embargo, en los comentarios en la misma página se dice que una interfaz puede incluir firmas de métodos, propiedades y eventos indexadores.
Si intenta poner un delegado en una interfaz, el compilador dice que "las interfaces no pueden declarar tipos".
El estándar Ecma-334 (8.9 Interfaces) está de acuerdo con los comentarios en esa página y en el compilador.
Parece un error en MSDN. Eso debería ser "las firmas de métodos, propiedades o eventos", ¿no es así? – configurator
este es un decalaration delegado TIPO ...
public delegate returntype MyDelegateType (params)
esto no puede ser declarado en una interfaz, ya que es una declaración de tipo
sin embargo con la declaración de tipo de arriba se puede utilizar una instancia de delegado
MyDelegateType MyDelegateInstance (get; set;)
tan delegar casos están bien, pero tipo de delegado declaraciones no son (en una interfaz)
La mejor respuesta hasta el momento. Al punto. Me encanta cuando las personas van al grano en lugar de escribir discursos. – DavidGuaita
Como han mencionado otros, solo puede definir delegados fuera de de la interfaz.
No hay nada malo con los delegados. personalmente creo que Func<int, double>
es menos deseable que utilizan delegados:
- No se puede nombrar a los argumentos, por lo que el significado argumento puede ser ambigua
Es noticia vieja que los acontecimientos no es seguro para subprocesos, por lo tanto el siguiente código no es ideal:
if (MyFuncEvent != null) { MyFuncEvent(42, 42.42); }
Ver: http://kristofverbiest.blogspot.com/2006/08/better-way-to-raise-events.html
El código más seguro es:
MyFuncEventHandler handler = MyFuncEvent; if (handler != null) { handler(42, 42.42); }
Usted tiene que duplicar la firma del evento si desea guardarla en una variable (o puede utilizar
var
, lo que me gusta). Si tiene muchos argumentos, esto puede ser muy tedioso (nuevamente, siempre puede ser flojo y usarvar
).Func<int, double, string, object, short, string, object> handler = MyFuncEvent; if (handler != null) { handler(42, 42.42, ...); }
Los delegados se salvan de tener que duplicar la firma del método/evento cada vez que desee asignar a un tipo variable.
Sin embargo, tenga en cuenta que el nombre _es los argumentos en el sitio llamado de una función lambda (pero sólo si hay más de dos): Acción
¡Es bueno saberlo! – swooby
Un método de interfaz puede aceptar un delegado como parámetro, no hay problemas. (¿Tal vez no veo el problema?) Pero si la intención es especificar una llamada saliente en la interfaz, use un evento.
Hay tantos pequeños detalles, que es mucho más fácil mostrar sólo algunas código en lugar de tratar de describir todo en prosa. (Lo siento, incluso el ejemplo de código es un poco hinchado ...)
namespace DelegatesAndEvents
{
public class MyEventArgs : EventArgs
{
public string Message { get; set; }
public MyEventArgs(string message) { Message = message; }
}
delegate void TwoWayCallback(string message);
delegate void TwoWayEventHandler(object sender, MyEventArgs eventArgs);
interface ITwoWay
{
void CallThis(TwoWayCallback callback);
void Trigger(string message);
event TwoWayEventHandler TwoWayEvent;
}
class Talkative : ITwoWay
{
public void CallThis(TwoWayCallback callback)
{
callback("Delegate invoked.");
}
public void Trigger(string message)
{
TwoWayEvent.Invoke(this, new MyEventArgs(message));
}
public event TwoWayEventHandler TwoWayEvent;
}
class Program
{
public static void MyCallback(string message)
{
Console.WriteLine(message);
}
public static void OnMyEvent(object sender, MyEventArgs eventArgs)
{
Console.WriteLine(eventArgs.Message);
}
static void Main(string[] args)
{
Talkative talkative = new Talkative();
talkative.CallThis(MyCallback);
talkative.TwoWayEvent += new TwoWayEventHandler(OnMyEvent);
talkative.Trigger("Event fired with this message.");
Console.ReadKey();
}
}
}
- 1. ¿Por qué no puedo poner una restricción en nvarchar (max)?
- 2. ¿Por qué no puedo declarar métodos estáticos en una interfaz?
- 3. ¿Por qué UtteranceProgressListener no es una interfaz?
- 4. ¿Por qué una interfaz no puede implementar otra interfaz?
- 5. ¿Debo poner una interfaz pública en un archivo separado?
- 6. ¿Por qué un delegado de .NET no se declara estático?
- 7. __unsafe_unretained por un delegado no construirá
- 8. Evento, delegado o interfaz?
- 9. ¿Por qué no puedo declarar un método público en una interfaz?
- 10. ¿Por qué no puedo exponer una interfaz en un servicio web .NET asmx?
- 11. ¿Por qué un delegado sin parámetros compila?
- 12. ¿Por qué no puedo usar la interfaz con operador explícito?
- 13. ¿Por qué puedo usar una expresión lambda en lugar de un delegado de devolución de llamada?
- 14. ¿Por qué le gustaría poner un índice en una vista?
- 15. ¿Por qué no hay una interfaz "configurada" en .NET Framework?
- 16. ¿Por qué no puedo poner una declaración de "uso" dentro de una declaración de clase?
- 17. ¿Por qué no hay una interfaz "Iterable" en el STL?
- 18. Intercambiando delegado/función e interfaz en D2
- 19. ¿Por qué no puedo convertir implícitamente un delegado con métodos de extensión?
- 20. Cómo agregar un delegado a una interfaz C#
- 21. ¿Por qué no puedo llamar a métodos dentro de una clase que implementa explícitamente una interfaz?
- 22. ¿Qué señala un delegado?
- 23. Java: ¿por qué no puedo lanzar una excepción en Comparator?
- 24. ¿Por qué no puedo @synthesize accessors en una categoría?
- 25. Herencia de interfaz Delphi: ¿Por qué no puedo acceder a los miembros de la interfaz ancestro?
- 26. ¿Por qué el puntero "this" es nulo en un delegado?
- 27. ¿Por qué lanzar a una interfaz?
- 28. ¿Por qué el delegado no maneja el evento nulo?
- 29. ¿Por qué no se llama a mi delegado de CLLocationmanager?
- 30. ¿Por qué no puedo poner una declaración de variable en la porción de prueba de un ciclo while?
Puede: ver a continuación: 1 http://stackoverflow.com/a/612971/16454 – devlord