stringtranslate.com

Función genérica

En programación de computadoras , una función genérica es una función definida para 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 para el polimorfismo en tiempo de compilación ( despacho estático ), específicamente polimorfismo paramétrico . Estas son funciones definidas con TypeParameters , destinadas a resolverse con información de tipo en tiempo de compilación . El compilador utiliza estos tipos para crear instancias de versiones adecuadas, resolviendo adecuadamente cualquier sobrecarga de funciones .

En el sistema de objetos Lisp común

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 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 The Art of the Metaobject Protocol explica en detalle la implementación y el uso de funciones genéricas CLOS.

Una de las primeras extensiones de programación orientada a objetos de Lisp es Flavours . Utilizó 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 habitual de llamada 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

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 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 colisionar 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 existe ningún espacio de nombres especial que tenga acceso a los espacios de clase.

 ( defmethod chocar (( objeto-1 asteroide ) ( objeto-2 nave espacial )) ( formato t "asteroide ~a choca con nave espacial ~a" objeto-1 objeto-2 ))          

Llamando a la función genérica:

? ( colisionar ( make-instance 'asteroide ) ( make-instance 'nave espacial )) asteroide # <ASTEROID 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 a partir de la función genérica colisionar especializada para las clases asteroide y nave espacial .

? ( método de búsqueda #' colisiona a cero ( lista ( asteroide de clase de búsqueda ) ( nave espacial de clase de búsqueda ))) # <MÉTODO ESTÁNDAR COLISION A NIL ( NAVE ESPACIAL ASTEROIDE ) 4150015E43>             

Comparación con otros idiomas

Las funciones genéricas corresponden aproximadamente a lo que Smalltalk llama 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 distribución múltiple, cuando se llama a una función genérica, la distribución del método 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 verificando dinámicamente el tipo del valor sobre el que se opera. Un caso de uso común de 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 particularmente adecuado para la creación de funciones genéricas, ya que los valores se pueden forzar o convertir fácilmente a diferentes tipos según sea necesario.


Referencias

  1. ^ El sistema de objetos Common Lisp: descripción general
  2. ^ "CommonLoops, fusión de 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 .