En programación informática , una función genérica es una función definida para el 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 ( despacho estático ), específicamente al polimorfismo paramétrico . Se trata de funciones definidas con TypeParameters , diseñadas para resolverse con información de tipo en tiempo de compilación . El compilador utiliza estos tipos para instanciar versiones adecuadas, resolviendo así cualquier sobrecarga de funciones de forma apropiada.
En el sistema de objetos de 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 con el mismo nombre. Normalmente, una función genérica es una instancia de una clase que hereda tanto de la clase function como de standard-object . Por lo tanto, las funciones genéricas son a la vez funciones (que pueden llamarse con argumentos y aplicarse a ellos) y 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 para Lisp es 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 debía ser una función real y que se debía utilizar la sintaxis habitual para llamar a funciones:
( 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 para el Common Lisp Object System.
Ejemplo
Lisp común
Define una función genérica con dos parámetros objeto-1 y objeto-2. El nombre de la función genérica es colisionar .
( defgeneric colisionar ( objeto-1 objeto-2 ))Los métodos pertenecientes a la función genérica se definen fuera de las clases. Aquí definimos un método para la función genérica `collide` , especializado para las clases `asteroide` (primer parámetro: objeto-1) y `spaceship` (segundo parámetro: objeto-2). Los parámetros se utilizan como variables normales dentro del cuerpo del método. No existe un espacio de nombres especial que tenga acceso a las ranuras de la clase.
( defmethod colisionar (( objeto-1 asteroide ) ( objeto-2 nave espacial )) ( formato t "el asteroide ~a colisiona con la nave espacial ~a" objeto-1 objeto-2 ))Llamando a la función genérica:
? ( colisionar ( crear instancia 'asteroide ) ( crear instancia 'nave espacial )) asteroide # <ASTEROIDE 4020003FD3> colisiona con nave espacial # <SPACESHIP 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 especializado para las clases asteroid y spaceship .
? ( find-method #' collide nil ( list ( find-class 'asteroid ) ( find-class 'spaceship ))) # <STANDARD-METHOD COLLIDE NIL ( ASTEROID SPACESHIP ) 4150015E43>Comparación con otros idiomas
Las funciones genéricas se corresponden aproximadamente con 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é bloque de código se llama: los tipos o valores de los argumentos son irrelevantes ( despacho único ). En un lenguaje de programación con despacho múltiple , cuando se llama a una función genérica, el despacho del método se produce en función de todos los argumentos, no solo de uno que tenga privilegios. Las nuevas variantes también proporcionaban funciones genéricas, pero solo con despacho único.
En JavaScript, una función genérica es aquella que puede trabajar con valores de distintos tipos, en lugar de con uno específico. Esto se logra mediante el uso de parámetros de tipo o comprobando dinámicamente el tipo del valor con el que se opera. Un caso de uso común para las funciones genéricas en JavaScript es la creación de funciones reutilizables que pueden trabajar con diferentes tipos de datos, como arrays, cadenas o 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
- Método (programación informática)