En programación informática , una función genérica es una función definida para el polimorfismo .
En lenguajes tipados estáticamente
En lenguajes de tipado estático (como C++ y Java ), el término funciones genéricas se refiere a un mecanismo de polimorfismo en tiempo de compilación ( static dispatch ), específicamente polimorfismo paramétrico . Se trata de funciones definidas con TypeParameters , destinadas a ser resueltas con información de tipo en tiempo de compilación . El compilador utiliza estos tipos para instanciar versiones adecuadas, resolviendo cualquier sobrecarga de función de forma adecuada.
En el sistema de objetos Common Lisp
En algunos sistemas de programación orientada a objetos, como Common Lisp Object System (CLOS) [1] y Dylan , una función genérica es una entidad formada por todos los métodos que tienen el mismo nombre. Normalmente, una función genérica es una instancia de una clase que hereda tanto de function como de standard-object . Por lo tanto, las funciones genéricas son tanto funciones (que se pueden llamar con argumentos y aplicar a ellos) como objetos ordinarios. El libro The Art of the Metaobject Protocol explica en detalle la implementación y el uso de las funciones genéricas de CLOS.
Una de las primeras extensiones de programación orientada a objetos de Lisp fue Flavors . Utilizaba el paradigma habitual de envío de mensajes influenciado por Smalltalk . La sintaxis de Flavors para enviar un mensaje es:
( enviar objeto :mensaje )
Con New Flavors, se decidió que el mensaje debería ser una función real y se debería utilizar la sintaxis de llamada de función habitual:
( objeto de mensaje )
message ahora es una función genérica , un objeto y una función por derecho propio. Las implementaciones individuales de message se denominan métodos .
La misma idea se implementó en CommonLoops . [2] New Flavors y CommonLoops fueron la principal influencia para el Sistema de Objetos Common Lisp.
Ejemplo
Ceceo común
Defina una función genérica con dos parámetros object-1 y object-2. El nombre de la función genérica es collide .
( defgeneric colisiona ( objeto-1 objeto-2 ))
Los métodos que pertenecen a la función genérica se definen fuera de las clases. Aquí definimos un método para la función genérica collide que está especializado para las clases asteroid (primer parámetro object-1) y spaceship (segundo parámetro object-2). Los parámetros se utilizan como variables normales dentro del cuerpo del método. No hay ningún espacio de nombres especial que tenga acceso a los espacios de clase.
( defmethod colisiona (( objeto-1 asteroide ) ( objeto-2 nave espacial )) ( formato t "el asteroide ~a choca con la nave espacial ~a" objeto-1 objeto-2 ))
Llamando a la función genérica:
? ( colisionar ( crear-instancia 'asteroide ) ( crear-instancia 'nave espacial )) el asteroide # <ASTEROIDE 4020003FD3> choca con la nave espacial # <NAVE ESPACIAL 40200048CB>
Common Lisp también puede recuperar métodos individuales de la función genérica. FIND-METHOD encuentra el método de la función genérica collide especializada para las clases asteroid y spaceship .
? ( método-buscar #' colisionar nil ( lista ( clase-buscar 'asteroide ) ( clase-buscar 'nave espacial ))) # < MÉTODO-ESTÁNDAR COLISIONAR NIL ( ASTEROIDE NAVE ESPACIAL ) 4150015E43>
Comparación con otros idiomas
Las funciones genéricas corresponden aproximadamente a lo que Smalltalk denomina métodos , con la notable excepción de que, en Smalltalk, la clase del receptor es el único determinante de qué cuerpo de código se llama: los tipos o valores de los argumentos son irrelevantes ( despacho único ). En un lenguaje de programación con envío múltiple , cuando se llama a una función genérica, el envío de métodos se produce sobre la base de todos los argumentos, no solo de uno que sea privilegiado. New Flavors también proporcionó funciones genéricas, pero solo envío único.
En JavaScript, una función genérica es una función que puede trabajar con valores de diferentes tipos, en lugar de un tipo específico. Esto se logra mediante el uso de parámetros de tipo o comprobando dinámicamente el tipo del valor sobre el que se opera. Un caso de uso común para las funciones genéricas en JavaScript es crear funciones reutilizables que puedan trabajar con diferentes tipos de datos, como matrices, cadenas u objetos. El sistema de tipado dinámico de JavaScript lo hace especialmente adecuado para la creación de funciones genéricas, ya que los valores se pueden convertir fácilmente a diferentes tipos según sea necesario.
Referencias
- ^ El sistema de objetos Common Lisp: una descripción general
- ^ "CommonLoops, fusionando Lisp y la programación orientada a objetos" (PDF) . Archivado desde el original (PDF) el 2011-06-04 . Consultado el 2009-12-10 .