Polimorfismo Fundamentos de POO – Vinculación Dinámica, Sobrescritura, Sobrecarga, Genéricos
Este artículo es una aclaración de conceptos sobre polimorfismo en POO, incluidas preguntas de examen y etiquetas.
En Resumen
El polimorfismo permite que una llamada unificada se aplique a diferentes implementaciones concretas, eligiendo la método apropiada en función del contexto, generalmente en tiempo de ejecución. El resultado es software flexible, extensible y con menor acoplamiento a tipos concretos.
Descripción Técnica Compacta
El polimorfismo denota la capacidad de los objetos de responder de manera diferente al mismo mensaje, dependiendo de su tipo real. El núcleo es la vinculación dinámica: las llamadas a métodos se resuelven en tiempo de ejecución mediante tablas de dispatch y vtables hacia la implementación apropiada. Se distingue el polimorfismo de subtipo a través de interfaces y herencia, el polimorfismo paramétrico a través de genéricos, y el polimorfismo ad hoc a través de sobrecarga. El diseño polimórfico respalda el Principio Abierto/Cerrado: las extensiones se logran mediante nuevos tipos en lugar de modificar los existentes.
Puntos Clave Relevantes para el Examen
- Polimorfismo de subtipo, uso a través de tipo base o interfaz, la implementación concreta se vincula en tiempo de ejecución
- Polimorfismo paramétrico, genéricos, un algoritmo para muchos tipos, seguridad de tipos sin casting
- Polimorfismo ad hoc, sobrecarga, mismo nombre, parámetros diferentes, vinculación estática
- Relevancia IHK, explicar con precisión la diferencia entre sobrescritura y sobrecarga, vinculación dinámica frente a estática
- Práctica, el patrón Strategy utiliza polimorfismo para intercambiabilidad de comportamiento sin cadenas if-else
- Aspecto de seguridad, los contratos e invariantes protegen contra sustituciones erróneas, validar entradas
- Rentabilidad, reduce costos de mantenimiento mediante extensibilidad, menos ramificaciones condicionales
- Obligación de documentación, contratos de interfaz, precondiciones, postcondiciones, efectos secundarios descritos con claridad
Componentes Principales
- Interfaz de contrato, firmas de métodos y semántica
- Implementaciones, clases concretas, estrategias
- Dispatch dinámico, vtable, single dispatch
- Dispatch estático, resolución en tiempo de compilación para sobrecarga
- Genéricos, parámetros de tipo, restricciones
- Testabilidad, contratos y pruebas de sustitución
- Patrones de diseño, Strategy, Template Method, Visitor
- Manejo de errores, excepciones compatibles con la interfaz base
- Aspectos de rendimiento, llamadas indirectas, inlining, optimización JIT
- Soporte de herramientas, UML, diagramas de clases, diagramas de secuencia
Ejemplo Práctico
// Polimorfismo de subtipo vía Strategy
interface PaymentMethod {
Receipt pay(int cents)
}
class CreditCard implements PaymentMethod {
public Receipt pay(int cents) {
// Autorización, clearing
return new Receipt("credit card", cents)
}
}
class PayPal implements PaymentMethod {
public Receipt pay(int cents) {
// Token, capture
return new Receipt("paypal", cents)
}
}
class CheckoutService {
private PaymentMethod method
public CheckoutService(PaymentMethod method) { this.method = method }
public Receipt checkout(int cents) {
if (cents <= 0) throw new IllegalArgumentException("se requiere un monto positivo")
return method.pay(cents)
}
}
Explicación: CheckoutService se comunica únicamente con la interfaz PaymentMethod, las implementaciones concretas se utilizan de manera intercambiable.
Ventajas y Desventajas
Ventajas
- Separación clara entre contrato e implementación
- Mejor extensibilidad, lógica condicional reducida
- Mayor testabilidad mediante mocks y stubs
- Promueve reutilización y encapsulación
Desventajas
- Las llamadas indirectas dificultan la depuración y el análisis de rendimiento
- Contratos incorrectos o vagos conducen a errores de sustitución
- Las jerarquías demasiado complejas aumentan la carga cognitiva
Preguntas Típicas de Examen (con Respuesta Breve)
-
¿Polimorfismo en el contexto de POO? Capacidad de que objetos diferentes se accedan a través del mismo contrato y ejecuten implementaciones dependientes del tipo en tiempo de ejecución.
-
¿Sobrecarga frente a Sobrescritura? Sobrecarga: el mismo método, parámetros diferentes, vinculación estática. Sobrescritura: el método heredado se reimplementa con la misma firma, vinculación dinámica.
-
¿Respalda el Principio Abierto/Cerrado? Las nuevas variantes se agregan como nuevas implementaciones de una interfaz existente, el código existente permanece sin cambios.
-
¿Qué exige el Principio de Sustitución de Liskov? Las subclases e implementaciones deben cumplir las promesas del tipo base, no endurecer precondiciones, no debilitar postcondiciones, respetar invariantes.
-
¿Ejemplo práctico sin cascadas if-else? Métodos de pago como estrategias detrás de PaymentMethod, la selección ocurre a través de la implementación concreta, no mediante condicionales.
-
¿Tipos de polimorfismo? Polimorfismo de subtipo, polimorfismo paramétrico mediante genéricos, polimorfismo ad hoc mediante sobrecarga, ocasionalmente multiple dispatch y Visitor.
-
¿Probar polimorfismo de manera efectiva? Definir una suite de pruebas de contrato contra la interfaz y ejecutarla contra todas las implementaciones, además pruebas de interacción basadas en mocks.
-
¿Duck Typing y sus límites? El comportamiento es válido si los métodos requeridos están presentes, sin relación de tipo explícita, flexible pero con menos seguridad en tiempo de compilación.
Fuentes Más Importantes
- https://docs.oracle.com/javase/tutorial/java/IandI/polymorphism.html
- https://de.wikipedia.org/wiki/Polymorphie_(Programmierung)
- https://martinfowler.com/bliki/Polymorphism.html
Continuando la Ruta de Aprendizaje en POO
Todos los artículos de POO están completos. Vuelve al primer artículo: Fundamentos de Programación Orientada a Objetos POO.



