Skip to content
IRC-CodingIRC-Coding
herenciaOOPinheritancepolimorfismoLiskovDiamond Problem

OOP Herencia: Inheritance, Polimorfismo y Principios

Herencia permite reutilizar código en clases base. Relación es-un, polimorfismo, Liskov Substitution Principle y Diamond Problem con ejemplos.

S

schutzgeist

3 min read
OOP Herencia: Inheritance, Polimorfismo y Principios

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

  1. Clase base (superclase): propiedades y comportamientos comunes
  2. Subclase: hereda y extiende la clase base
  3. Sobrescritura de métodos: comportamiento adaptado en subclases
  4. Polimorfismo: una interfaz, múltiples implementaciones
  5. Vinculación dinámica: resolución de llamadas a métodos en tiempo de ejecución
  6. Clases abstractas: no pueden instanciarse
  7. Interfaces: definición de contrato puro sin implementación
  8. 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

  1. ¿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.

  2. Explica el Principio de Sustitución de Liskov. Las subclases deben poder reemplazar a sus clases base sin que cambie el comportamiento del programa.

  3. ¿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.

  4. ¿Cuándo usar clases abstractas vs interfaces? Clases abstractas para implementación compartida, interfaces para definición de contrato puro.

Fuentes Principales

  1. https://de.wikipedia.org/wiki/Vererbung_(Programmierung)
  2. https://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html
  3. 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.

Volver al blog
Share:

Nächster Artikel in Desarrollo de Software

Weiterlesen
OOP Polimorfismo: Binding Dinámico y Dispatch

Entradas relacionadas