2011-07-20 40 views
13

Estaba buscando otras preguntas relacionadas con el patrón de visitante, pero no pude entender la implementación del doble despacho en el patrón de visitante.¿Cómo funciona el doble despacho en el patrón de visitante?

Por favor, consulte el enlace Visitor Pattern

¿Cómo funciona el doble de despacho en el patrón del visitante?

+0

¿Puede ser más específico con respecto a lo que no comprende? – jzd

+0

Imho debería pensar en duplicar despacho como una función de sobrecarga en tiempo de ejecución en lugar de tiempo de compilación. – dierre

Respuesta

16

El método del objeto accept recibe un objeto visitante y llama al método visit en el objeto visitante. Como el objeto visitante tiene varios métodos visit, según el tipo de elemento se llama al método visit apropiado. Aquí tenemos dos llamadas (doble de despacho) que especifican el elemento y el derecho operación para el elemento (basado en su tipo).

6

Bueno, aquí está la cita relevante de ese artículo:

Visitante implementa “doble expedición”. Los mensajes OO manifiestan rutinariamente "envío único": la operación que se ejecuta depende de: el nombre de la solicitud y el tipo de receptor. En "doble despacho", la operación ejecutada depende de: el nombre de la solicitud y el tipo de DOS receptores (el tipo de Visitante y el tipo de elemento que visita).

Esto significa esencialmente que diferentes visitantes pueden visitar el mismo tipo y diferentes tipos pueden ser visitados por el mismo visitante. El efecto de una operación con nombre que se realiza utilizando el patrón de visitante puede depender del visitante y visitado (despacho doble).

24

Single-despacho

Single dispatch

Supongamos nodo es una clase de interfaz y las dos subclases son implementaciones concretas de la interfase.

Si llama al método GenerateCode() en una instancia de nodo, la operación real que se ejecuta depende del tipo del nodo. Podría ser el método en VariableRefNode o AssignmentNode. Es lo mismo si llama al PrettyPrint(). Entonces, la operación real que se ejecuta depende del nombre del método que está llamando y del tipo del nodo.

doble despacho

Nodes Visitors

Esta vez el Node es lo que le permite pasar un parámetro de tipo NodeVisitor a su método llamado Accept.En su programa si se llama Accept en una instancia de nodo, el funcionamiento real de la silla eléctrica ahora depende del tipo del nodo (VariableRefNode o AssignmentNode) Y del tipo de la instancia de visitantes que ha pasado en Accept (TypeCheckingVisitor o CodeGeneratingVisitor) .

+0

No entiendo por qué su respuesta no obtuvo la mayoría de los votos, ¿verdad? –

Cuestiones relacionadas