2011-07-31 15 views

Respuesta

6

eventos son ideales para cuando usted tiene un "tiene una", mientras que las anulaciones son mucho mejores para situaciones donde se tiene una "es una" relación

Por ejemplo, si usted tiene un animal de la clase base, Es probable que cada animal tenga su propia forma de moverse. sin embargo, todos los animales de alguna manera van a querer moverse.

Ahora piense en una persona de clase que pueda 'tener' un animal de compañía. en este caso, la Persona podría reaccionar ante el movimiento del animal, pero en realidad no manejaría el movimiento del animal.

+0

¡Excelente respuesta! ¡Supongo que eso tiene sentido! –

+0

Esta idea me intriga. Continuando con su declaración, ¿podría ampliar su respuesta para usar esas frases en una oración de ejemplo o dos? – ckittel

7

Las dos características son vagamente similares (ambas están diseñadas para hacer alguna forma de despacho dinámico), pero no son directamente comparables.

Los eventos deben notificar a otros objetos que un objeto ha llegado a algún tipo de state transition. Es una función de idioma que incorpora the Observer Design Pattern. Esto puede ser útil en muchos casos, pero no siempre es útil o deseable. Es una herramienta para realizar trabajos específicos.

Las funciones virtuales se utilizan para crear Object Oriented Polymorphism. Son un bloque de construcción básico de casi todos los patrones de diseño, y un montón de diseño orientado a objetos.

Para tratar de compararlos, supongo que está intentando implementar algún tipo de patrón de observador con cualquiera de las características. Con esa restricción establecida, todavía no hay una regla simple en la que pueda recurrir para decidir cuál debe usar. En su lugar, usted tiene que preguntarse preguntas como:

  • que lo causó: ¿La acción que desencadena producirse internamente, o en su transición de estado va a ser activado externamente?

Si se desencadena internamente, puede usar un evento o un método virtual. Si se desencadena externamente, debe usar un método virtual.

  • quién le importa al respecto: caso de la clase que define el estado manejar las consecuencias de la transición de estado, o una clase externa debe manejarlo?

Si la clase que posee el estado debe manejar la transición, entonces debe ser un método virtual. Si una clase separada debe reaccionar a la transición, debería ser un evento.

  • ¿Cuántas manipuladores qué necesito: qué siempre necesita un controlador para reaccionar a la transición de estado, o necesita muchos?

Si necesita una, puede ser aceptable usar un método virtual o un evento. Si necesita muchos, será mucho más fácil usar un evento.

  • sé qué manejador quiero en tiempo de compilación: hacer yo se unen a un único controlador conocido, o tengo unen a los manipuladores de desconocidos, posiblemente cambiando con el tiempo?

Si necesita que sus controladores cambien, debe usar eventos. Si solo tiene un manejador único conocido en tiempo de compilación, puede usar un método virtual.

  • ¿Cómo debería ser acoplada mi código: ¿Su código del controlador pertenece a una clase derivada de su tipo original, o pertenece a otra parte?

Si pertenece a una clase derivada, necesita un método virtual. Si pertenece a otra parte, entonces necesitas un evento.

Como puede ver, las respuestas dependerán en gran medida del dominio específico de su problema y de la arquitectura del objeto. Un buen diseño no es algo que mágicamente cae en su regazo a través de una lista de verificación. Usted tiene que pensar en ello, mucho :)

Editar:

Puede que no sea directamente aplicable a eventos C#, pero puede ser útil para tomar ejemplo de trabajo existente. Aquí hay un breve artículo que acabo de encontrar (al responder una pregunta diferente) sobre alternativas de diseño en Java para patrones de eventos: http://csis.pace.edu/~bergin/patterns/event.html

Cuestiones relacionadas