2010-07-11 15 views
5

que tienen este tipo de código:¿Cómo invocar un evento automáticamente cuando se llama a una función?

public class Foo 
{ 
    public SomeHandler OnBar; 

    public virtual void Bar() 
    { 
    } 
} 

Foo es una clase base y para ello otras clases podría heredar de ella.
Me gustaría que el evento OnBar siempre se active cuando se llama a Bar(), incluso si no se llama explícitamente dentro de Bar.
¿Cómo se puede hacer?

Respuesta

9

Un patrón común es tener un método no virtual que hará lo que usted desee que llame a un método virtual. Las subclases pueden anular el método interno para cambiar la funcionalidad, pero el método público puede ser no virtual, siempre plantee primero el evento.

public class Foo 
{ 
    public SomeHandler OnBar; 

    public void Bar() 
    { 
     if (OnBar != null) 
     { 
      OnBar(this, EventArgs.Empty); 
     } 
     BarImpl(); 
    } 

    protected virtual void BarImpl() 
    { 
    } 
} 
+0

Básicamente una implementación del patrón de método de plantilla + 1 – DanP

+0

¿Así que esta es la mejor manera? En C++ usaría bind() para crear una nueva función a partir de la función de invocación de eventos y la función original. –

2

Respuesta corta: no se puede. No con lo que Microsoft te da de la caja.

Dicho esto, eche un vistazo a la "programación orientada a aspectos" en .NET. Google eso, puede obtener algo útil.

Agregado: La manera estándar sería elevar el evento en el método Bar() y luego requerir todas las clases derivadas para llamar a la implementación base. Pero no se puede hacer cumplir.

1

en primer lugar el código que ha proporcionado no se compilará.
las funciones virtuales deben tener un cuerpo.

Para asegurarse de que el evento se dispare, puede hacer algo como esto.

public class Foo 
{ 
    public SomeHandler OnBar; 

    public void Bar() 
    { 
    OnBar(); (check for nulls) 
    ProtectedBar(); 
    } 

    protected virtual ProtectedBar() 
    { 
    } 
} 
+0

Estás en lo correcto. Sin embargo, eso no importa en este caso. Fue solo para demostrar que la función puede ser anulada. No sé por qué estabas abajo. Subí para balancear. –

+1

El código que ha proporcionado no compilará tampoco: su función virtual no tiene ningún tipo de devolución y su comentario no es un comentario. –

+0

Supongo que algún coleccionista de insignias me votó por una insignia. :) –

0

Como dijo Vilx-, supongo que la mejor manera de hacer este tipo de cosas es utilizar programación orientada a aspectos.

Esto lo ayudaría con el "código enmarañado" (es decir, llamar a un evento en un método que no debería tener esta responsabilidad) y el "código disperso" (es decir, llamar al mismo evento en muchos métodos, duplicar su código) problemas.

Debe echar un vistazo a postsharp, tiene una edición de comunidad gratuita.

Cuestiones relacionadas