Programación Orientada a Objetos · Programación

Herencia y polimorfismo

Modelar jerarquías con herencia, redefinir comportamiento y aprovechar el polimorfismo para escribir código que trate objetos distintos de forma uniforme.

Herencia y polimorfismo

Ilustracion de programacion orientada a objetos: jerarquia de clases con herencia y encapsulamiento.
Principios de la programacion orientada a objetos: clases, herencia y polimorfismo.

Mapa conceptual

Reutilizar y generalizar Si Perro y Gato ambos comen y duermen, no repitas ese código: define un Animal y haz que hereden. Y cuando algo llame a «hablar()», no te importa si es perro o gato: responderá cada uno a su manera. Eso es polimorfismo.

Herencia

Una clase puede heredar de otra: la subclase (hijo) recibe los atributos y métodos de la superclase (padre) y puede añadir los propios o reescribir los heredados. Se expresa indicando el padre entre paréntesis al definir la clase.

Override y super

Polimorfismo

Polimorfismo es que distintos objetos respondan al MISMO mensaje con comportamiento propio. Una lista [perro, gato, pajaro] puede recibir un bucle que llame a hablar() en cada elemento sin preguntar de qué tipo es. El código depende de la interfaz, no del tipo concreto.

Sustituibilidad

El principio de sustitución de Liskov: donde se espera un Animal, debería poder colocarse cualquier subtipo sin romper el programa. Si un «Pinguino» no puede volar aunque vuele() esté en el padre, la jerarquía está mal diseñada.

Herencia organiza; polimorfismo desacopla.
ConceptoQué esPara qué sirve
Herenciasubclase recibe lo de la superclaseno repetir
Overrideredefinir un método heredadoespecializar
super()llamar al método del padrereutilizar y extender
Polimorfismomismo mensaje, respuesta según tipocódigo genérico y extensible

¿Qué permite el polimorfismo en un bucle que llama a dibujar() sobre formas distintas?

Herencia múltiple

Una clase puede heredar de varias. Da flexibilidad pero introduce el problema del diamante: ¿qué versión de un método se usa? Python lo resuelve con un orden lineal (MRO). Como regla, evita herencia múltiple profunda y prefiere composición.

Cuándo NO heredar

Solo tiene sentido heredar cuando hay una relación es-un real y compartida: un Coche ES-un Vehículo. Heredar solo para reutilizar código, cuando no hay esa relación, produce jerarquías frágiles; mejor composición (tema de la siguiente lección).

Gracias al polimorfismo, una función que recibe un Animal puede funcionar con subtipos que se creen en el futuro sin modificarse.

Duck typing sin herencia

En Python a menudo no hace falta heredar una base común: basta con que el objeto implemente el método esperado (duck typing, «si camina como pato...»). El polimorfismo no exige una jerarquía formal, solo una interfaz compartida.

Errores frecuentes

Clasifica cada situación:

Buena herencia
Mala herencia

Real Python
Herencia frente a composición, con ejemplos.

Modela una jerarquía de medios de pago (tarjeta, transferencia, efectivo) con un método procesar(). Explica dónde aplica polimorfismo y por qué NO heredarías efectivo de tarjeta.

Python: Classes
Tutorial oficial de clases en Python 3.