En programación de computadoras , una función genérica es una función definida por polimorfismo .
En lenguajes de tipado estático
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 ( distribución estática ), específicamente polimorfismo paramétrico . Estas son funciones definidas con TypeParameters , destinadas a resolverse con información de tipo de tiempo de compilación . El compilador usa estos tipos para crear instancias de versiones adecuadas, resolviendo adecuadamente cualquier función que se sobrecargue .
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 compuesta 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 la función como del objeto estándar . Por lo tanto, las funciones genéricas son tanto funciones (que pueden llamarse con argumentos y aplicarse a ellos) como objetos ordinarios. El libro El arte del protocolo de metaobjetos 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 es Flavours . Usó el paradigma de envío de mensajes habitual 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 habitual de llamada a la función:
( objeto de mensaje )
El mensaje ahora es una función genérica , un objeto y una función por derecho propio. Las implementaciones individuales del mensaje se denominan métodos .
La misma idea se implementó en CommonLoops . [2] New Flavors y CommonLoops fueron la principal influencia del Common Lisp Object System.
Ejemplo
Lisp común
Defina una función genérica con dos parámetros objeto-1 y objeto-2. El nombre de la función genérica es colisionar .
( colisión defgenérica ( 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 asteroide (primer parámetro objeto-1) y nave espacial (segundo parámetro objeto-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 collide (( objeto-1 asteroide ) ( objeto-2 nave espacial )) ( formato t "asteroide ~ a choca con nave espacial ~ a" objeto-1 objeto-2 ))
Llamar a la función genérica:
? ( collide ( make-instance 'asteroide ) ( make-instance ' nave espacial )) asteroide # 4020003FD3> choca con 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 asteroide y nave espacial .
? ( método de búsqueda # ' colisionar nil ( lista ( clase de búsqueda ' asteroide ) ( nave espacial de clase de búsqueda ' ))) # étodo> COLLIDE NIL ( NAVE ESPACIAL DE ASTEROIDES ) 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 ( envío ú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étodo se produce sobre la base de todos los argumentos, no solo de uno que tiene privilegios. New Flavors también proporcionó funciones genéricas, pero solo un envío único.
Referencias
- ^ El sistema de objetos Common Lisp: una descripción general
- ^ "CommonLoops, Fusionando Lisp y programación orientada a objetos" (PDF) . Archivado desde el original (PDF) el 4 de junio de 2011 . Consultado el 10 de diciembre de 2009 .