Função genérica

Da Wikipédia, a enciclopédia livre
Ir para a navegação Saltar para pesquisar

Na programação de computadores , uma função genérica é uma função definida para polimorfismo .

Em linguagens digitadas estaticamente

Em linguagens de tipagem estática (como C++ e Java ), o termo funções genéricas refere-se a um mecanismo para polimorfismo em tempo de compilação ( despacho estático ), especificamente polimorfismo paramétrico . Essas são funções definidas com TypeParameters , destinadas a serem resolvidas com informações de tipo de tempo de compilação . O compilador usa esses tipos para instanciar versões adequadas, resolvendo qualquer sobrecarga de função apropriadamente.

No Common Lisp Object System

Em alguns sistemas para programação orientada a objetos como o Common Lisp Object System (CLOS) [1] e Dylan , uma função genérica é uma entidade composta por todos os métodos com o mesmo nome. Normalmente, uma função genérica é uma instância de uma classe que herda de function e de objeto padrão . Assim, funções genéricas são tanto funções (que podem ser chamadas com argumentos e aplicadas a argumentos) quanto objetos comuns. O livro The Art of the Metaobject Protocol explica detalhadamente a implementação e o uso de funções genéricas CLOS.

Uma das primeiras extensões de programação orientada a objetos para Lisp é Flavors . Ele usou o paradigma de envio de mensagens usual influenciado pelo Smalltalk . A sintaxe Flavors para enviar uma mensagem é:

 ( enviar  objeto  :mensagem )

Com New Flavors, foi decidido que a mensagem deveria ser uma função real e a sintaxe de chamada de função usual deveria ser usada:

 ( objeto de mensagem  )

message agora é uma função genérica , um objeto e uma função por direito próprio. As implementações individuais da mensagem são chamadas de métodos .

A mesma ideia foi implementada em CommonLoops . [2] New Flavors e CommonLoops foram a principal influência para o Common Lisp Object System.

Exemplo

Lisp comum

Defina uma função genérica com dois parâmetros object-1 e object-2. O nome da função genérica é colidir .

 ( defgeneric  colidir  ( objeto-1  objeto-2 ))

Os métodos pertencentes à função genérica são definidos fora das classes. Aqui definimos um método para a função genérica colidir que é especializado para as classes asteróide (primeiro parâmetro objeto-1) e nave espacial (segundo parâmetro objeto-2). Os parâmetros são usados ​​como variáveis ​​normais dentro do corpo do método. Não há nenhum namespace especial que tenha acesso a slots de classe.

 ( defmethod  colidir  (( objeto-1  asteroide )  ( objeto-2  nave espacial )) 
   ( formato  t  "asteroide ~a colide com nave espacial ~a"  objeto-1  objeto-2 ))

Chamando a função genérica:

?  ( colidir  ( make-instance  'asteroid )  ( make-instance  'nave )) 
asteróide  # <ASTEROID  4020003FD3>  colide  com a  nave espacial  # <  SPACESHIP 40200048CB>

Common Lisp também pode recuperar métodos individuais da função genérica. FIND-METHOD encontra o método da função genérica colide especializado para as classes asteróide e nave espacial .

?  ( find-method  #' colidir  nil  ( list  ( find-class  'asteroid )  ( find-class  'spaceship ))) 
# <STANDARD-METHOD  COLLIDE  NIL  ( ASTEROID  SPACESHIP )  4150015E43>

Comparação com outros idiomas

Funções genéricas correspondem aproximadamente ao que Smalltalk denomina métodos , com a notável exceção de que, em Smalltalk, a classe do receptor é o único determinante de qual corpo de código é chamado: os tipos ou valores dos argumentos são irrelevantes ( single dispatch ). Em uma linguagem de programação com despacho múltiplo quando uma função genérica é chamada, o despacho de método ocorre com base em todos os argumentos, não apenas em um que é privilegiado. New Flavors também forneceu funções genéricas, mas apenas despacho único.

Referências

  1. ^ O Common Lisp Object System: Uma visão geral
  2. ^ "CommonLoops, mesclando Lisp e programação orientada a objetos" (PDF) . Arquivado a partir do original (PDF) em 2011-06-04 . Recuperado 2009-12-10 .