Skip to content
IRC-CodingIRC-Coding
herenciaOOPclase basesubclasesobrescriturapolimorfismoLiskov Substitution Principlecomposición

Herencia OOP: Conceptos Básicos Explicados

Aprende herencia en OOP: clases base, subclases, sobrescritura, polimorfismo, Liskov Substitution Principle y composición.

S

schutzgeist

4 min read
Herencia OOP: Conceptos Básicos Explicados

Herencia OOP Fundamentos: Clase Base, Subclase, Sobrescritura, Polimorfismo, Liskov

Este artículo es una aclaración de conceptos sobre herencia en OOP, incluyendo preguntas de examen y etiquetas.

En Síntesis

La herencia permite definir propiedades y comportamientos comunes en una clase base y reutilizarlos en subclases. El objetivo es la reutilización de código, polimorfismo y relaciones de tipo claras sin duplicación.

Descripción Técnica Compacta

La herencia establece una relación es-un entre tipos, donde una subclase hereda todos los miembros públicos y protegidos de la clase base, pudiendo extenderlos o sobrescribirlos. Habilita polimorfismo, vinculación dinámica y resolución tardía de métodos: el dispatch ocurre según el tipo real del objeto en tiempo de ejecución. Se distingue herencia de implementación de herencia de interfaz, por ejemplo mediante interfaces. El Principio de Sustitución de Liskov exige que las subclases se comporten como su clase base, sin sorprender a los clientes. Problemas como clase base frágil, problema del diamante y acoplamiento fuerte sugieren composición antes que herencia cuando solo necesitas reutilización sin una relación es-un verdadera.

Puntos Clave para Examen

  • Relación es-un, aplicar correctamente, no usar para relaciones tiene-un
  • Sobrescritura, override, permite comportamiento polimórfico, la firma debe permanecer compatible
  • Visibilidad: public, protected, private, afecta heredabilidad y acceso
  • Relevante para IHK: diferenciar herencia de implementación e herencia de interfaz
  • Composición antes que herencia: menor acoplamiento, mejor intercambiabilidad en la práctica
  • Respetar LSP: no endurecer precondiciones, no debilitar postcondiciones, mantener invariantes
  • Economía: menos duplicación, pero riesgo de refactorings costosos si la jerarquía es incorrecta
  • Obligación de documentación: contratos, efectos secundarios, reglas de sobrescritura, puntos de extensión

Componentes Clave

  1. Clase base, superclase con atributos y métodos comunes
  2. Subclase, hereda, extiende, sobrescribe
  3. Sobrescritura, override con dispatch dinámico
  4. Sobrecarga, overload: mismo nombre de método, parámetros distintos, no requiere herencia
  5. Clase abstracta: base común con comportamiento parcialmente implementado
  6. Interfaz: contrato puro para herencia múltiple de tipos
  7. Finalidad: sello final contra sobrescritura y herencia
  8. Encadenamiento de constructores: llamada super, orden de inicialización
  9. Derechos de acceso: protected para extensores, private para encapsulación estricta
  10. Métodos de prueba: tests de sustitución y contrato, tests de polimorfismo

Ejemplo Práctico

// Ejemplo con sintaxis similar a Java: herencia y polimorfismo
abstract class Shape {
public abstract double area()
}

class Rectangle extends Shape {
private double w, h
public Rectangle(double w, double h) {
if (w <= 0 || h <= 0) throw new IllegalArgumentException("positive Maße")
this.w = w
this.h = h
}
@Override
public double area() {
return w * h
}
}

class Circle extends Shape {
private double r
public Circle(double r) {
if (r <= 0) throw new IllegalArgumentException("positiver Radius")
this.r = r
}
@Override
public double area() {
return Math.PI * r * r
}
}

// Uso polimórfico
Shape s1 = new Rectangle(3, 4)
Shape s2 = new Circle(2)
double sum = s1.area() + s2.area()

Explicación: Shape define el contrato area, las subclases lo implementan de forma específica, las llamadas se resuelven polimórficamente.

Ventajas e Inconvenientes

Ventajas

  • Reutilización de código, polimorfismo
  • Contrato claro mediante interfaz común
  • Reducción de implementaciones redundantes, API uniforme para clientes

Inconvenientes

  • Acoplamiento fuerte a decisiones de la clase base
  • Jerarquías frágiles, refactoring más difícil
  • Problema del diamante en herencia múltiple, posible violación de encapsulación

Preguntas Típicas de Examen (Con Respuesta Breve)

  1. ¿Es apropiada la herencia? Cuando existe una relación es-un verdadera y la subclase puede usarse en cualquier lugar donde se espera la clase base.

  2. ¿Sobrescritura vs. Sobrecarga? Sobrescritura reemplaza el comportamiento heredado con la misma firma en la subclase. Sobrecarga define múltiples métodos con el mismo nombre pero parámetros distintos.

  3. ¿Polimorfismo en el contexto de herencia? Una referencia del tipo base puede contener objetos de la clase base o sus subclases, las llamadas a métodos se vinculan en tiempo de ejecución al tipo real del objeto.

  4. ¿Por qué composición antes que herencia? Composición reduce acoplamiento, evita jerarquías rígidas, permite implementaciones intercambiables, mejor para reutilización sin relación es-un verdadera.

  5. ¿Rol de protected? Protected permite que las subclases accedan, pero puede debilitar encapsulación, usarlo con moderación, preferir private con métodos de acceso.

  6. ¿Qué exige el Principio de Sustitución de Liskov? No endurecer precondiciones, no debilitar postcondiciones, mantener invariantes de la clase base, de lo contrario se rompe la intercambiabilidad.

  7. ¿Explicar el problema del diamante? Herencia múltiple de dos clases base con ancestro común genera ambigüedad, algunos lenguajes lo resuelven con herencia virtual.

  8. ¿Cómo probar intercambiabilidad? Tests de contrato contra las clases base, definir especificación de interfaz, ejecutar los mismos tests contra instancias de todas las subclases.

Fuentes Principales

  1. https://docs.oracle.com/javase/specs/
  2. https://de.wikipedia.org/wiki/Vererbung_(Programmierung)
  3. https://martinfowler.com/articles/inheritance.html

Continúa en el Camino de Aprendizaje OOP

Todos los artículos de OOP están completos. Vuelve al primer artículo: Programación Orientada a Objetos OOP Fundamentos.

Volver al blog
Share:

Nächster Artikel in Programación

Weiterlesen
Lógica de Programación: Guía Completa

Entradas relacionadas