Herencia en OOP: Fundamentos, Inheritance y Polimorfismo
Este artículo es una aclaración de conceptos sobre herencia en la programación orientada a objetos, incluyendo preguntas de examen y etiquetas.
En Pocas Palabras
La herencia permite definir propiedades y comportamientos comunes en una clase base y reutilizarlos en subclases. El objetivo es evitar código redundante, habilitar polimorfismo y establecer relaciones de tipos claras.
Descripción Técnica Compacta
La herencia establece una relación es-un entre tipos, donde una subclase hereda todas las características públicas y protegidas de la clase base, pudiendo extenderlas u omitirlas.
Posibilita polimorfismo, vinculación dinámica y resolución tardía de métodos. El despacho ocurre según el tipo real del objeto en tiempo de ejecución.
Se distingue entre herencia de implementación e herencia de interfaz, por ejemplo a través de interfaces. El Principio de Sustitución de Liskov establece que las subclases deben comportarse como su clase base sin sorprender a los clientes.
Problemas como la clase base frágil, el problema del diamante y el acoplamiento fuerte sugieren favorecer composición sobre herencia cuando solo se necesita reutilización sin una verdadera relación es-un.
Puntos Clave para Exámenes
- Relación es-un entre subclase y clase base
- Polimorfismo permite invocaciones de métodos dinámicas en tiempo de ejecución
- Principio de Sustitución de Liskov: las subclases deben ser reemplazables por sus clases base
- Problema del diamante: la herencia múltiple puede generar ambigüedades
- Herencia de implementación vs herencia de interfaz
- Representación UML: punta de flecha abierta desde la subclase hacia la superclase
- Modificadores de acceso controlan la extensibilidad y la capacidad de sobrescritura
- Composición sobre herencia cuando solo se necesita reutilización
Componentes Clave
- Clase base (superclase): propiedades y comportamientos comunes
- Subclase: hereda y extiende la clase base
- Sobrescritura de métodos: comportamiento adaptado en subclases
- Polimorfismo: una interfaz, múltiples implementaciones
- Vinculación dinámica: resolución de llamadas a métodos en tiempo de ejecución
- Clases abstractas: no pueden instanciarse
- Interfaces: definición de contrato puro sin implementación
- Métodos finales: no pueden sobrescribirse
Ejemplo Práctico
// Ejemplo: herencia en la jerarquía animal
abstract class Tier {
protected String name;
public Tier(String name) {
this.name = name;
}
public abstract void machGeraeusch();
public void schlafen() {
System.out.println(name + " schläft.");
}
}
class Hund extends Tier {
public Hund(String name) {
super(name);
}
@Override
public void machGeraeusch() {
System.out.println(name + " bellt: Wuff!");
}
public void wedleSchwanz() {
System.out.println(name + " wedelt mit dem Schwanz.");
}
}
class Katze extends Tier {
public Katze(String name) {
super(name);
}
@Override
public void machGeraeusch() {
System.out.println(name + " miaut: Miau!");
}
}
// Polimorfismo en acción
Tier[] tiere = {new Hund("Bello"), new Katze("Mimi")};
for (Tier tier : tiere) {
tier.machGeraeusch(); // Vinculación dinámica
tier.schlafen();
}
Ventajas e Inconvenientes
Ventajas
- Reutilización de código: definir comportamiento común en un solo lugar
- Polimorfismo: tratar diferentes tipos de forma uniforme
- Extensibilidad: agregar nueva funcionalidad mediante subclases
- Estructura clara: jerarquías y relaciones definidas
Inconvenientes
- Acoplamiento fuerte: las subclases quedan estrechamente vinculadas a las clases base
- Clase base frágil: los cambios pueden romper todas las subclases
- Problema del diamante: la herencia múltiple puede causar conflictos
- Sobre-ingeniería: usar herencia donde la composición sería mejor
Preguntas Frecuentes de Examen
-
¿Cuál es la diferencia entre herencia y composición? La herencia es una relación es-un, la composición es una relación tiene-un. Favorece la composición cuando solo necesites reutilización.
-
Explica el Principio de Sustitución de Liskov. Las subclases deben poder reemplazar a sus clases base sin que cambie el comportamiento del programa.
-
¿Qué es el problema del diamante? Cuando una clase hereda de dos clases base que a su vez heredan de una clase común, creando ambigüedad.
-
¿Cuándo usar clases abstractas vs interfaces? Clases abstractas para implementación compartida, interfaces para definición de contrato puro.
Fuentes Principales
- https://de.wikipedia.org/wiki/Vererbung_(Programmierung)
- https://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html
- https://refactoring.guru/de/design-patterns
Continúa en el Camino de Aprendizaje de OOP
El próximo artículo en el camino de aprendizaje de OOP trata OOP Polymorphie: Grundlagen, Dynamische Bindung & Dispatch, explicando cómo el polimorfismo permite llamadas uniformes a diferentes implementaciones.
Literatura Recomendada: Programación Orientada a Objetos
Keine Bücher für Kategorie "objektorientierte-programmierung" gefunden.



