stringtranslate.com

Polimorfismo ad hoc

En lenguajes de programación , el polimorfismo ad hoc [1] es un tipo de polimorfismo en el que las funciones polimórficas se pueden aplicar a argumentos de diferentes tipos, porque una función polimórfica puede denotar un número de implementaciones distintas y potencialmente heterogéneas dependiendo del tipo de argumento(s) al que se aplica. Cuando se aplica a conceptos orientados a objetos o procedimentales, también se conoce como sobrecarga de funciones o sobrecarga de operadores . El término ad hoc en este contexto no pretende ser peyorativo; se refiere simplemente al hecho de que este tipo de polimorfismo no es una característica fundamental del sistema de tipos . Esto contrasta con el polimorfismo paramétrico , en el que las funciones polimórficas se escriben sin mencionar ningún tipo específico y, por lo tanto, pueden aplicar una única implementación abstracta a cualquier número de tipos de forma transparente. Esta clasificación fue introducida por Christopher Strachey en 1967.

Encuadernación temprana

El polimorfismo ad hoc es un mecanismo de envío : el control que se mueve a través de una función nombrada se envía a varias otras funciones sin tener que especificar la función exacta que se está llamando. La sobrecarga permite que múltiples funciones que toman diferentes tipos se definan con el mismo nombre; el compilador o intérprete se asegura automáticamente de que se llame a la función correcta. De esta manera, se podrían escribir funciones que agreguen listas de números enteros , listas de cadenas , listas de números reales , etc., y todas se llamarían append —y se llamaría a la función append correcta en función del tipo de listas que se estén agregando. Esto difiere del polimorfismo paramétrico, en el que la función debería escribirse de forma genérica , para funcionar con cualquier tipo de lista. Usando la sobrecarga, es posible hacer que una función realice dos cosas completamente diferentes en función del tipo de entrada que se le pasa; esto no es posible con el polimorfismo paramétrico (pero se tendría que lograr activando el tipo dentro de la función genérica). Otra forma de ver la sobrecarga es que una rutina se identifica de forma única no por su nombre, sino por la combinación de su nombre y el número, orden y tipos de sus parámetros.

Este tipo de polimorfismo es común en los lenguajes de programación orientados a objetos , muchos de los cuales permiten sobrecargar operadores de manera similar a las funciones (ver sobrecarga de operadores ). Algunos lenguajes que no tienen tipado dinámico y carecen de polimorfismo ad hoc (incluidas las clases de tipos) tienen nombres de función más largos, como print_int, print_string, etc. Esto puede verse como una ventaja (más descriptivo) o una desventaja (demasiado verboso) según el punto de vista de cada uno.

Una ventaja que a veces se obtiene de la sobrecarga es la aparición de especialización; por ejemplo, una función con el mismo nombre se puede implementar de varias maneras diferentes, cada una optimizada para los tipos de datos particulares con los que opera. Esto puede proporcionar una interfaz conveniente para el código que necesita especializarse en múltiples situaciones por razones de rendimiento. La desventaja es que el sistema de tipos no puede garantizar la coherencia de las diferentes implementaciones.

Dado que la sobrecarga se realiza en tiempo de compilación, no sustituye al enlace tardío que se encuentra en el polimorfismo de subtipificación .

Encuadernación tardía

A pesar de lo expuesto en la sección anterior, existen otras formas en las que el polimorfismo ad hoc puede funcionar. Consideremos, por ejemplo, el lenguaje Smalltalk. En Smalltalk , la sobrecarga se realiza en tiempo de ejecución, ya que los métodos ("implementación de función") para cada mensaje sobrecargado ("función sobrecargada") se resuelven cuando están a punto de ejecutarse. Esto sucede en tiempo de ejecución, después de que se compila el programa. Por lo tanto, el polimorfismo se da mediante la subtipificación del polimorfismo como en otros lenguajes, y también se extiende en funcionalidad mediante el polimorfismo ad hoc en tiempo de ejecución.

Un análisis más detallado también revelará que Smalltalk ofrece una variedad ligeramente diferente de polimorfismo ad hoc . Dado que Smalltalk tiene un modelo de ejecución de límite tardío y que proporciona a los objetos la capacidad de manejar mensajes que no se entienden, es posible implementar funcionalidades mediante polimorfismo sin sobrecargar explícitamente un mensaje en particular. Puede que esta no sea una práctica recomendada en general para la programación diaria, pero puede ser bastante útil al implementar proxies.

Además, aunque en términos generales la sobrecarga de métodos y constructores de clases comunes no se considera polimorfismo, existen lenguajes más uniformes en los que las clases son objetos regulares. En Smalltalk, por ejemplo, las clases son objetos regulares. A su vez, esto significa que los mensajes enviados a las clases pueden sobrecargarse y también es posible crear objetos que se comporten como clases sin que sus clases hereden de la jerarquía de clases. Estas son técnicas efectivas que se pueden utilizar para aprovechar las potentes capacidades de reflexión de Smalltalk . También son posibles disposiciones similares en lenguajes como Self y Newspeak .

Ejemplo

Imagine un operador +que pueda utilizarse de las siguientes maneras:

  1. 1 + 2 = 3
  2. 3.14 + 0.0015 = 3.1415
  3. 1 + 3.7 = 4.7
  4. [1, 2, 3] + [4, 5, 6] = [1, 2, 3, 4, 5, 6]
  5. [true, false] + [false, true] = [true, false, false, true]
  6. "bab" + "oon" = "baboon"

Para manejar estas seis llamadas de función, se necesitan cuatro fragmentos de código diferentes (o tres, si las cadenas se consideran listas de caracteres):

Por lo tanto, el nombre +en realidad se refiere a tres o cuatro funciones completamente diferentes. Este es un ejemplo de sobrecarga o, más específicamente, sobrecarga de operadores .

Tenga en cuenta la ambigüedad de los tipos de cadenas utilizados en el último caso. Considere "123" + "456"que el programador podría asumir naturalmente una adición en lugar de una concatenación. Podría esperar "579"en lugar de "123456". Por lo tanto, la sobrecarga puede proporcionar un significado o semántica diferente para una operación, así como diferentes implementaciones.

Véase también

Referencias

  1. ^ C. Strachey, Conceptos fundamentales en lenguajes de programación. Apuntes de clase para la Escuela Internacional de Verano de Programación Informática, Copenhague, agosto de 1967