Despacho múltiplo
Despacho múltiplo (ou multimétodo) é funcionalidade disponível em algumas linguagens orientadas a objeto em que uma subrotina ou método pode ser especializado em tipo para mais de um argumento.
Em uma linguagem de despacho único, quando um método é invocado (envio de mensagem no Smalltalk ou chamada de função membro em C++), um de seus argumentos é tratado especialmente, sendo usado para determinar qual dos métodos sobrecarregados deve ser usado. Em linguagens de despacho múltiplo, todos os argumentos são tratados simetricamente na seleção do método.
O Common Lisp Object System é exemplo de linguagem que permite despacho múltiplo.
Índice |
Tipos de dados [editar]
Quando trabalha-se com linguagens que discriminam os tipos de dados em tempo de compilação, a seleção entre as alternativas pode ocorrer em tempo de compilação. A criação de tais funções alternatvias em tempo de compilação é geralmente referido como sobrecarga.
Em linguagens de programação que discriminam os tipos de dados em tempo de execução, a seleção entre as alterantivas pode ocorrer em tempo de execução, baseado nos tipos determinados dinamicamente dos argumentos. Funções cujas implementações alternativas são selecionadas dessa forma são chamadas multimétodos.
Há um custo computacional associado às chamadas de função dinamicamente despachadas.
Uso em diferentes linguagens [editar]
Java [editar]
Em uma linguagem com despacho único como Java, o código pode ser estruturado da seguinte forma:
abstract class Coisa { /** tornando este método não abstrato não mudaria a demonstração */ public abstract void colideCom(Coisa outra); } class Asteroide extends Coisa { public void colideCom(Coisa outra) { if (outra instanceof Asteroide) { // trata colisão Asteroide-Asteroide } else if (outra instanceof Espaconave) { // trata colisão Asteroide-Espaconave } } } class Espaconave extends Coisa { public void colideCom(Coisa outra) { if (outra instanceof Asteroide) { // trata colisão Espaconave-Asteroide } else if (outra instanceof Espaconave) { // trata colisão Espaconave-Espaconave } } }
Common Lisp [editar]
Em uma linguagem com despacho múltiplo como Common Lisp, o código pode ser estruturado da seguinte forma:
(defmethod colide-com ((x asteroide) (y asteroide)) ;; trata colisão Asteroide-Asteroide ) (defmethod colide-com ((x asteroide) (y espaconave)) ;; trata colisão Asteroide-Espaconave ) (defmethod colide-com ((x espaconave) (y asteroide)) ;; trata colisão Espaconave-Asteroide ) (defmethod colide-com ((x espaconave) (y espaconave)) ;; trata colisão Espaconave-Espaconave )
Note que o teste explícito e a conversão de tipo não é usada.
C++ [editar]
O despache múltiplo difere da sobrecarga de métodos em C++ já que é feito em tempo de execução a partir dos tipos dinâmicos dos argumentos, ao invés de em tempo de compilação a partir dos tipos estáticos dos argumentos. Autor do C++, Bjarne Stroustrup discutiu o tema e propôs alternativas para o C++1 .
Python [editar]
Em linguagens que não suportam despacho múltiplo na definição da linguagem ou a nível sintático, é geralmente possível adicionar a funcionalidade através de uma extensão da biblioteca. por exemplo, o módulo multimethods.py do Python prove a funcionalidade ao estilo CLOS sem a mudança da sintaxe da linguagem.
from multimethods import Dispatch from objetos_do_jogo import Asteroide, Espaconave from comportamentos_do_jogo import AEFunc, EEFunc, EAFunc, AAFunc colide = Dispatch() colide.add_rule((Asteroide, Espaconave), AEFunc) colide.add_rule((Espaconave, Espaconave), EEFunc) colide.add_rule((Espaconave, Asteroide), EAFunc) colide.add_rule((Asteroide, Asteroide), AAFunc) # ...posteriormente... colide(objeto1, objeto2)
Entretanto, usando os decoradores de Python 2.4, pode-se produzir o mesmo efeito com uma sintaxe simplificada:
@multimethod(Asteroide, Asteroide) def colide(a, b): """Comportamento para colisão asteroide e asteroide""" # ...define... @multimethod(Asteroide, Espaconave) def colide(a, b): """comportamento para colisão asteroide e espaconave""" # ...define...
Referências
- ↑ Peter Pirkelbauer, Yuriy Solodkyy, Bjarne Stroustrup (Outubro de 2007). Open Multi-Methods for C++ (em inglês). Proceedings of the 6th international conference on Generative programming and component engineering, 2007. Sítio pessoal de Bjarne Stroustrup. Página visitada em 25 de junho de 2008.