Función genérica

Ajustar Compartir Imprimir Citar

En programación informática, una función genérica es una función definida por polimorfismo.

En lenguajes escritos estáticamente

En lenguajes de tipos estáticos (como C++ y Java), el término funciones genéricas se refiere a un mecanismo para polimorfismo en tiempo de compilación (despacho estático), específicamente polimorfismo paramétrico. Estas son funciones definidas con TypeParameters, destinadas a ser resueltas con información de tipo de tiempo de compilación. El compilador usa estos tipos para crear instancias de versiones adecuadas, resolviendo cualquier sobrecarga de función de manera adecuada.

En el sistema de objetos Common Lisp

En algunos sistemas de programación orientada a objetos, como Common Lisp Object System (CLOS) 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 función como de objeto estándar. Por lo tanto, las funciones genéricas son funciones (que se pueden llamar y aplicar a argumentos) 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 de Lisp es Flavours. Usó 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 usar la sintaxis de llamada de función habitual:

 ()Mensaje objeto)

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. New Flavors y CommonLoops fueron la principal influencia para el Common Lisp Object System.

Ejemplo

Ceceo 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 colisión.

 ()defgeneric collide ()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á especializada para las clases asteroide (primer objeto de parámetro-1) y nave espacial (segundo objeto de parámetro-2). Los parámetros se utilizan como variables normales dentro del cuerpo del método. No hay un espacio de nombres especial que tenga acceso a los espacios de clase.

 ()defmethod collide ()objeto-1 asteroides) ()objeto-2 nave espacial) ()formato t "asteroid ~a colides con nave espacial ~a" objeto-1 objeto-2)

Llamar a la función genérica:

? ()collide ()make-instance 'asteroid) ()make-instance 'Espacialidad)asteroides #. 4020003FD3 colides con nave espacial #. 40200048CB titulado

Common Lisp también puede recuperar métodos individuales de la función genérica. FIND-METHOD encuentra el método a partir de la función genérica colisión especializada para las clases asteroide y nave espacial.

? ()encontrar-método # 'collide Nil ()lista ()clase de búsqueda 'asteroid) ()clase de búsqueda 'Espacialidad))#ENTREDARD-METHOD COLLIDE NIL ()ASTEROID SPACESHIP) 4150015E43 titulado

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 del método se produce sobre la base de todos los argumentos, no solo de uno privilegiado. New Flavours 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 de valor que se está operando. Un caso de uso común para funciones genéricas en JavaScript es crear funciones reutilizables que puedan funcionar con diferentes tipos de datos, como matrices, cadenas u objetos. El sistema de escritura dinámica de JavaScript lo hace especialmente adecuado para la creación de funciones genéricas, ya que los valores se pueden forzar fácilmente o convertir a diferentes tipos según sea necesario.