„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Zusammensetzung vs. Vererbung

Zusammensetzung vs. Vererbung

Veröffentlicht am 09.11.2024
Durchsuche:643

Composición vs Herencia

Einführung

Vererbung und Zusammensetzung sind zwei grundlegende Konzepte in der objektorientierten Programmierung (OOP), aber sie werden unterschiedlich verwendet und haben unterschiedliche Zwecke. Ziel dieses Beitrags ist es, diese Zwecke zu besprechen und einige Dinge zu besprechen, die bei der Auswahl zu beachten sind.

Konzepte der Vererbung

Wenn wir über die Anwendung der Vererbung in unseren Designs nachdenken, müssen wir Folgendes verstehen:

  • Definition: Bei der Vererbung kann eine Klasse (abgeleitete Klasse oder Unterklasse genannt) Eigenschaften und Verhaltensweisen von einer anderen Klasse (Basisklasse oder Superklasse genannt) erben. Die abgeleitete Klasse kann die Funktionalität der Basisklasse erweitern oder ändern.
  • Beziehung: Es ist eine Beziehung „ist ein“ (is-a). Wenn Sie beispielsweise eine Klasse „Fahrzeug“ und eine andere Klasse „Auto“ haben, ist die Klasse „Auto“ eine Unterklasse von „Fahrzeug“.
  • Vorteile: Fördert die Wiederverwendung von Code und ermöglicht eine einfache Erweiterung der Funktionalität.

Kompositionskonzepte

Andererseits, wenn wir darüber nachdenken, Objekte zusammenzusetzen:

  • Definition: In der Komposition enthält ein Objekt andere Objekte und delegiert einen Teil seiner Funktionalität an diese. Anstelle von Vererbung verwendet eine Klasse Instanzen anderer Klassen, um ihre Funktionalität zu erreichen.
  • Beziehung: Es handelt sich um eine „hat-ein“-Beziehung. Wenn Sie beispielsweise eine Klasse „Motor“ und eine Klasse „Auto“ haben, kann die Klasse „Auto“ ein Objekt der Klasse „Motor“ haben.
  • Vorteile: Größere Flexibilität und weniger Kopplung zwischen Klassen. Änderungen in einer Klasse wirken sich nicht direkt auf die andere aus.

Warum eine Erbschaftskomposition?

Die Frage, ob Komposition besser ist als Vererbung oder umgekehrt, ist ein umstrittenes Thema im Software-Design. Beide Ansätze haben ihre Vor- und Nachteile und die Wahl hängt vom spezifischen Projektkontext und den Anforderungen ab. Hier präsentiere ich Ihnen ein Beispiel, bei dem die Komposition der Vererbung vorzuziehen sein kann.

Sehen wir uns ein Beispiel in Java an, das zeigt, wie die Komposition in bestimmten Fällen der Vererbung vorzuziehen sein kann. Angenommen, wir arbeiten an einem Bestellabwicklungssystem in einem Online-Shop.

  • Vererbungsansatz:

Betrachten wir zunächst einen Ansatz, der Vererbung nutzt, um verschiedene Arten käuflicher Produkte wie Bücher und Elektronik darzustellen:

// Clase base para productos
class Producto {
    String nombre;
    double precio;

    Producto(String nombre, double precio) {
        this.nombre = nombre;
        this.precio = precio;
    }

    void procesarPedido() {
        System.out.println("Procesando pedido para "   nombre);
    }
}

// Clase para productos electrónicos que hereda de Producto
class ProductoElectronico extends Producto {
    String modelo;

    ProductoElectronico(String nombre, double precio, String modelo) {
        super(nombre, precio);
        this.modelo = modelo;
    }
}

// Clase para libros que hereda de Producto
class Libro extends Producto {
    String autor;

    Libro(String nombre, double precio, String autor) {
        super(nombre, precio);
        this.autor = autor;
    }
}

Dieser Ansatz funktioniert, aber was ist, wenn Sie neue Produkttypen einführen oder bestimmte Funktionen für bestimmte Produkttypen hinzufügen müssen?

  • Fokus mit Komposition:

Anstatt uns ausschließlich auf die Vererbung zu verlassen, könnten wir die Zusammensetzung verwenden, um verschiedene Arten von Produkten flexibler zu handhaben:

// Clase para productos
class Producto {
    String nombre;
    double precio;

    Producto(String nombre, double precio) {
        this.nombre = nombre;
        this.precio = precio;
    }

    void procesarPedido() {
        System.out.println("Procesando pedido para "   nombre);
    }
}

// Clase para productos electrónicos que utiliza composición
class ProductoElectronico {
    Producto producto;
    String modelo;

    ProductoElectronico(String nombre, double precio, String modelo) {
        this.producto = new Producto(nombre, precio);
        this.modelo = modelo;
    }

    // Puedes agregar lógica específica para productos electrónicos si es necesario
    void procesarPedidoEspecifico() {
        System.out.println("Procesando pedido específico para "   producto.nombre);
    }
}

// Clase para libros que utiliza composición
class Libro {
    Producto producto;
    String autor;

    Libro(String nombre, double precio, String autor) {
        this.producto = new Producto(nombre, precio);
        this.autor = autor;
    }

    // Puedes agregar lógica específica para libros si es necesario
    void procesarPedidoEspecifico() {
        System.out.println("Procesando pedido específico para "   producto.nombre);
    }
}

Bei diesem Ansatz verfügt jeder Produkttyp über eine Instanz der Produktklasse, sodass eine gemeinsame Logik für die Verarbeitung von Bestellungen genutzt werden kann. Darüber hinaus kann jeder Produkttyp mithilfe von Methoden wie „processSpecificOrder()“ über eine eigene spezifische Logik verfügen. Dieses Design ist flexibler und erleichtert die Einführung neuer Produkttypen oder die Änderung typspezifischer Logik, ohne die Vererbungshierarchie zu beeinträchtigen.

Wann soll die Erbschaft beantragt werden?

Während die Wahl zwischen Vererbung und Komposition beim Softwaredesign vom Kontext und den spezifischen Anforderungen des Problems abhängt, mit dem Sie sich befassen. Hier sind einige Situationen, in denen Sie die Vererbung als geeignetere Option als die Komposition in Betracht ziehen könnten:

  • „Ist-ein“-Beziehung: Vererbung ist besonders geeignet, wenn zwischen Klassen eine klare „Ist-ein“-Beziehung besteht. Wenn eine Klasse B eine spezifischere oder spezialisiertere Version einer Klasse A ist, ist eine Vererbung sinnvoll. Wenn Sie beispielsweise eine Fahrzeugklasse und eine Autoklasse haben, ist die „ist-ein“-Beziehung klar, da ein Auto ein Fahrzeugtyp ist.
class Vehiculo {
    // ...
}

class Automovil extends Vehiculo {
    // ...
}
  • Code-Wiederverwendung: Vererbung ermöglicht die Wiederverwendung von Code, da die abgeleitete Klasse die Mitglieder und Methoden der Basisklasse erbt. Dies kann von Vorteil sein, wenn zwischen verwandten Klassen eine erhebliche Menge gemeinsamer Code vorhanden ist.
class Animal {
    void comer() {
        // Lógica común para comer
    }
}

class Perro extends Animal {
    void ladrar() {
        // Lógica específica para ladrar
    }
}
  • Polymorphismus: Vererbung ist von grundlegender Bedeutung für die Implementierung des Polymorphismus, der es abgeleiteten Klassen ermöglicht, spezifische Implementierungen von Methoden bereitzustellen, die von der Basisklasse geerbt wurden. Dies ist in Szenarien nützlich, in denen Sie Objekte abgeleiteter Klassen einheitlich behandeln müssen.
class Figura {
    void dibujar() {
        // Lógica común para dibujar una figura
    }
}

class Circulo extends Figura {
    void dibujar() {
        // Lógica específica para dibujar un círculo
    }
}

class Cuadrado extends Figura {
    void dibujar() {
        // Lógica específica para dibujar un cuadrado
    }
}

  • Funktionalitätserweiterungen: Wenn Sie vorhandene Funktionen erweitern oder spezialisieren, ist die Vererbung möglicherweise natürlicher. Wenn Sie beispielsweise eine Bibliothek entwickeln und eine Basisklasse mit grundlegender Funktionalität bereitstellen, können Benutzer Ihrer Bibliothek von dieser Basisklasse ableiten, um diese Funktionalität zu erweitern.

Was passiert, wenn wir eine schlechte Erbschaft machen?

Wenn wir weiterhin die Vor- und Nachteile der Vererbung abwägen, besteht eines der Probleme, die aus einer schlechten Vererbung entstehen können, darin, dass wir gegen das Prinzip der Schnittstellentrennung verstoßen würden, das besagt, dass Clients nicht gezwungen werden sollten, sich auf Schnittstellen zu verlassen, die sie nutzen nicht verwenden. Wenn eine Schnittstelle auf eine Weise erweitert wird, die Methoden enthält, die nicht für alle Implementierungen relevant sind, könnten Clients, die diese Schnittstelle verwenden, gezwungen werden, Methoden zu implementieren, die sie nicht benötigen, was zu einem weniger sauberen und schwierigeren Design führen kann pflegen.

Abschluss

Zusammenfassend lässt sich sagen, dass sich die Vererbung auf die Beziehung „ist ein“ konzentriert und zur Modellierung von Klassenhierarchien verwendet wird, während sich die Zusammensetzung auf die Beziehung „hat ein“ konzentriert und dazu verwendet wird, komplexe Objekte aus anderen einfacheren Objekten zu konstruieren. Beide Ansätze haben ihre spezifischen Anwendungsfälle und werden basierend auf der Struktur und Art der Beziehungen im Softwaredesign ausgewählt.

Freigabeerklärung Dieser Artikel ist abgedruckt unter: https://dev.to/rlgino/composicion-vs-herencia-4664?1 Bei Verstößen wenden Sie sich bitte an [email protected], um ihn zu löschen
Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3