Subtipado


En la teoría del lenguaje de programación , la subtipificación (también polimorfismo de subtipo o polimorfismo de inclusión ) es una forma de polimorfismo de tipo en la que un subtipo es un tipo de datos que está relacionado con otro tipo de datos (el supertipo ) por alguna noción de sustituibilidad , lo que significa que los elementos del programa, típicamente subrutinas o funciones, escritas para operar en elementos del supertipo también pueden operar en elementos del subtipo. Si S es un subtipo de T, la relación de subtipificación a menudo se escribe S <: T, para indicar que cualquier término de tipo S puede serutilizado con seguridad en un contexto donde se espera un término de tipo T. La semántica precisa de la subtipificación depende de manera crucial de los detalles de lo que significa "usado de forma segura en un contexto donde" en un lenguaje de programación determinado . El sistema de tipos de un lenguaje de programación define esencialmente su propia relación de subtipificación, que bien puede ser trivial , si el lenguaje no admite (o admite muy pocos) mecanismos de conversión.

Debido a la relación de subtipificación, un término puede pertenecer a más de un tipo. La subtipificación es, por lo tanto, una forma de polimorfismo de tipos. En la programación orientada a objetos, el término 'polimorfismo' se usa comúnmente para referirse únicamente a este subtipo de polimorfismo , mientras que las técnicas de polimorfismo paramétrico se considerarían programación genérica .

Los lenguajes de programación funcionales a menudo permiten la subtipificación de registros . En consecuencia, el cálculo lambda simplemente tipificado ampliado con tipos de registro es quizás el marco teórico más simple en el que se puede definir y estudiar una noción útil de subtipificación. [1] Debido a que el cálculo resultante permite que los términos tengan más de un tipo, ya no es una teoría de tipos "simple" . Dado que los lenguajes de programación funcionales, por definición, admiten literales de función, que también se pueden almacenar en registros, los tipos de registros con subtipado proporcionan algunas de las características de la programación orientada a objetos. Por lo general, los lenguajes de programación funcional también proporcionan alguna forma, generalmente restringida, de polimorfismo paramétrico. En un marco teórico, es deseable estudiar la interacción de las dos características; un ajuste teórico común es el sistema F <: . Varios cálculos que intentan capturar las propiedades teóricas de la programación orientada a objetos pueden derivarse del sistema F <: .

El concepto de subtipificación está relacionado con las nociones lingüísticas de hiponimia y holonimia . También está relacionado con el concepto de cuantificación acotada en lógica matemática (ver Lógica ordenada por orden ). La subtipificación no debe confundirse con la noción de herencia (clase u objeto) de los lenguajes orientados a objetos; [2] la subtipificación es una relación entre tipos (interfaces en el lenguaje orientado a objetos) mientras que la herencia es una relación entre implementaciones derivada de una característica del lenguaje que permite crear nuevos objetos a partir de los existentes. En varios lenguajes orientados a objetos, la subtipificación se denomina herencia de interfaz , y la herencia se conoce comoherencia de implementación .

La noción de subtipado en lenguajes de programación se remonta a la década de 1960; se introdujo en los derivados de Simula . Los primeros tratamientos formales de subtipificación fueron realizados por John C. Reynolds en 1980, quien usó la teoría de categorías para formalizar conversiones implícitas , y Luca Cardelli (1985). [3]

El concepto de subtipado ha ganado visibilidad (y sinónimo de polimorfismo en algunos círculos) con la adopción generalizada de la programación orientada a objetos. En este contexto, el principio de sustitución segura a menudo se denomina principio de sustitución de Liskov , en honor a Barbara Liskov , quien lo popularizó en un discurso de apertura en una conferencia sobre programación orientada a objetos en 1987. Debido a que debe considerar objetos mutables, la noción ideal de subtipificación definido por Liskov y Jeannette Wing , llamado subtipado de comportamiento es considerablemente más fuerte que lo que se puede implementar en un verificador de tipos . (Consulte § Tipos de funciones a continuación para obtener más detalles).


Ejemplo de subtipos: donde pájaro es el supertipo y todos los demás son subtipos como indica la flecha en la notación UML