En el contexto de la informática, el subtipado es una clase de polimorfismo. Se define como una relación entre dos tipos de forma que si un tipo S es subtipo de T (denotado como S <: T), en todos los lugares en los que se puede utilizar un valor de tipo T, también es válido uno de tipo S. En esta relación se denomina a S subtipo y a T, supertipo.
El ejemplo más típico de esta relación se da en el paradigma de la programación orientada a objetos, en concreto en la relación de herencia entre clases.
Otros ejemplos incluyen, el subtipado de registros y funciones en el paradigma funcional o el duck typing en lenguajes con tipado dinámico como Python o JavaScript.
Ejemplos de subtipado Un ejemplo simple de subtipado es la relación entre dos tipos, "perro" y "animal", donde animal es el supertipo y perro el subtipo. Un perro es un animal, pero no todos los animales son perros.
Java Como ejemplo de subtipado en un lenguaje orientado a objetos:
// archivo Animal.java interface Animal { public void grito(); }
// archivo perro.java class Perro implements Animal { public void grito() { this.ladrido();
public void ladrido() { System.out.println("Guau!")
public Perro() { }
// ... }
// archivo main.java class Main { public static int main(int argc, String [] argv) { Animal animal = Perro() animal.grito() // -> Guau!
Python Como ejemplo de subtipado por duck typing: class Perro: def grito(self): print("Guau!")
class Pato: def grito(self): print("Cuac!")
def haz_ruido(animal): # En este caso, animal es un supertipo de todos los valores con una función # grito() animal.grito()
perro = Perro() haz_ruido(perro) # -> Guau!
pato = Pato() haz_ruido(pato) # -> Cuac!
Subtipado de registros en el paradigma funcional Es típico en lenguajes funcionales incluir un sistema de subtipado de registros de forma que S es un subtipo de T si todas las claves del supertipo T están presentes en el subtipo S con valores de tipos compatibles.
Esta definición obedece al hecho de que siempre se pueden ignorar claves adicionales de S para compatibilizarlos y que la reordenación de pares clave-valor es legítima, puesto que no existe el acceso indexado a esta estructura de datos, solo por clave.
De esta forma, si en una variante del cálculo lambda tipado y con soporte para declaraciones de tipos, el estilo de subtipado mencionado y registros y enteros, se define la siguiente expresión:
T := {a: Entero, b: Entero} S := {b: Entero, c: Entero, a: Entero}
(λv: T. (T.a)) ({a = 3, b = 2, c = 5}: S)
Esta sería tipable y de tipo 'Entero'.
Referencias
Categoría:Teoría de tipos