JavaRush /Java-Blog /Random-DE /Beziehungen zwischen Klassen. Vererbung, Zusammensetzung ...

Beziehungen zwischen Klassen. Vererbung, Zusammensetzung und Aggregation

Veröffentlicht in der Gruppe Random-DE
Hallo! Heute werfen wir einen genaueren Blick auf ein weiteres Prinzip der objektorientierten Programmierung (OOP) – die Vererbung. Gleichzeitig werden wir andere Arten von Beziehungen zwischen Klassen untersuchen – Zusammensetzung und Aggregation. Dieses Thema wird nicht schwierig sein: Sie sind in früheren Vorlesungen bereits mehrfach auf die Vererbung und ihre Beispiele gestoßen. Heute geht es vor allem darum, Ihr Wissen zu festigen, den Mechanismus der Vererbung genauer unter die Lupe zu nehmen und die Beispiele noch einmal durchzugehen :) Also, nichts wie los!
Beziehungen zwischen Klassen.  Vererbung, Zusammensetzung und Aggregation – 1

Vererbung in Java und ihre Vorteile

Wie Sie sich wahrscheinlich erinnern, ist Vererbung ein Mechanismus, der es Ihnen ermöglicht, eine neue Klasse basierend auf einer vorhandenen (übergeordneten) Klasse zu beschreiben. In diesem Fall werden die Eigenschaften und Funktionalitäten der übergeordneten Klasse von der neuen Klasse übernommen. Erinnern wir uns an das Beispiel der Vererbung aus früheren Vorlesungen:
public class Car {

   private String model;
   private int maxSpeed;
   private int yearOfManufacture;

   public Car(String model, int maxSpeed, int yearOfManufacture) {
       this.model = model;
       this.maxSpeed = maxSpeed;
       this.yearOfManufacture = yearOfManufacture;
   }


public void gas() {
       //...Gas
   }

public void brake() {
       //...Bremse
   }
}


public class Truck extends Car {

   public Truck(String model, int maxSpeed, int yearOfManufacture) {
       super(model, maxSpeed, yearOfManufacture);
   }
}



public class Sedan extends Car {
   public Sedan(String model, int maxSpeed, int yearOfManufacture) {
       super(model, maxSpeed, yearOfManufacture);
   }
}
Es gibt ein bestimmtes Programm, in dessen Rahmen wir mit verschiedenen Fahrzeugtypen arbeiten. Auch wenn Sie kein Autoliebhaber sind, wissen Sie wahrscheinlich, dass es auf der Welt sehr viele Arten dieser Autos gibt :) Deshalb unterteilen wir die allgemeinen Eigenschaften von Autos in eine gemeinsame übergeordnete Klasse – Car. Was haben alle Autos, unabhängig vom Typ, gemeinsam? Jedes Auto hat ein Baujahr, einen Modellnamen und eine Höchstgeschwindigkeit. Diese Eigenschaften tragen wir in die Felder model, maxSpeed, ein yearOfManufacture. Was das Verhalten betrifft, kann jedes Auto beschleunigen und bremsen :) Wir definieren dieses Verhalten in Methoden gas()und brake(). Welche Vorteile bringt uns das? Zunächst einmal die Reduzierung der Codemenge. Natürlich können wir auch auf die Elternklasse verzichten. Da aber jedes Auto beschleunigen und bremsen kann, müssen wir Methoden gas()in brake()der Klasse Truck, in der Klasse Sedan, in der Klasse F1Car, in der Klasse Sportcarund in allen anderen Fahrzeugklassen erstellen. Stellen Sie sich vor, wie viel zusätzlichen Code wir in diesem Fall schreiben werden. Vergessen Sie nicht die Felder „model“, „maxSpeed“ und „yearOfManufacture“: Wenn wir die übergeordnete Klasse aufgeben, werden wir sie in jeder der Maschinenklassen erstellen! Beziehungen zwischen Klassen.  Vererbung, Zusammensetzung und Aggregation – 2 Wenn wir ein paar Dutzend Maschinenklassen haben, wird die Menge an sich wiederholendem Code wirklich groß. Durch das Verschieben gemeinsamer Felder und Methoden (auch „State“ und „Behavior“ genannt) in die übergeordnete Klasse können wir viel Zeit und Platz sparen. Wenn ein bestimmter Typ über Eigenschaften oder Methoden verfügt, die nur für ihn einzigartig sind und bei anderen Maschinentypen nicht vorhanden sind, spielt das keine Rolle. Sie können immer getrennt von allen anderen in einer Nachfolgeklasse erstellt werden.
public class F1Car extends Car {

   public void pitStop() {

       //...nur Rennwagen machen Boxenstopps
   }

   public static void main(String[] args) {

       F1Car formula1Car = new F1Car();
       formula1Car.gas();
       formula1Car.pitStop();
       formula1Car.brake();
   }
}
Nehmen wir den Fall der Formel-1-Rennwagen. Im Gegensatz zu ihren „Verwandten“ haben sie ein einzigartiges Verhalten – von Zeit zu Zeit halten sie für einen Boxenstopp an. Das stört uns nicht. Wir haben das allgemeine Verhalten in der übergeordneten Klasse bereits beschrieben Carund können innerhalb der Klassen spezifisches Verhalten der untergeordneten Klassen hinzufügen. Beziehungen zwischen Klassen.  Vererbung, Zusammensetzung und Aggregation – 3 Dies gilt auch für Felder: Wenn eine untergeordnete Klasse eindeutige Eigenschaften hat, können wir diese Felder ruhig darin deklarieren und müssen uns keine Sorgen machen :) Die Möglichkeit, Code wiederzuverwenden, ist der Hauptvorteil der Vererbung. Für einen Programmierer ist es sehr wichtig, keine unnötigen Mengen an Code zu schreiben. Dies wird Ihnen in Ihrer Arbeit mehr als einmal begegnen. Bitte denken Sie an eine weitere sehr wichtige Sache: In Java gibt es keine Mehrfachvererbung. Jede Klasse erbt nur von einer Klasse. Wir werden in zukünftigen Vorlesungen ausführlicher auf die Gründe dafür eingehen, aber denken Sie zunächst daran. Dies unterscheidet Java übrigens von einigen anderen OOP-Sprachen. C++ verfügt beispielsweise über Mehrfachvererbung. Bei der Vererbung ist alles mehr oder weniger klar – weiter geht’s.

Zusammensetzung und Aggregation

Klassen und Objekte können miteinander in Beziehung gesetzt werden. Vererbung beschreibt die Beziehung „ist“ (oder auf Englisch „IS A“). Löwe ist ein Tier. Diese Beziehung kann leicht durch Vererbung ausgedrückt werden, wobei Animaldie Klasse die übergeordnete Klasse und Liondie Klasse das untergeordnete Element ist. Allerdings werden nicht alle Beziehungen auf der Welt auf diese Weise beschrieben. Beispielsweise ist eine Tastatur definitiv in irgendeiner Weise mit einem Computer verbunden, es handelt sich jedoch nicht um einen Computer . Die Hände sind irgendwie mit der Person verbunden, aber sie sind nicht die Person. In diesen Fällen liegt eine andere Art von Beziehung zugrunde: nicht „ist“, sondern „ist Teil“ („HAS A“). Die Hand ist keine Person, aber sie ist Teil einer Person. Die Tastatur ist kein Computer, aber sie ist Teil des Computers. HAS-A-Beziehungen können mithilfe von Kompositions- und Aggregationsmechanismen im Code beschrieben werden . Der Unterschied zwischen ihnen liegt in der „Strenge“ dieser Verbindungen. Geben wir ein einfaches Beispiel: Wir haben unseres Car– ein Auto. Jedes Auto hat einen Motor. Darüber hinaus hat jedes Auto Passagiere im Inneren. Was ist der grundlegende Unterschied zwischen Feldern Engine engineund Passenger [] passengers? Wenn sich in einem Auto ein Passagier befindet А, heißt das nicht, dass darin keine Passagiere sein Bdürfen C. Ein Wagen bietet Platz für mehrere Passagiere. Auch wenn alle Passagiere aus dem Auto entfernt werden, funktioniert es weiterhin leise. Das Verhältnis zwischen Klasse Carund Passagiermasse Passenger [] passengersist weniger streng. Es heißt Aggregation . Zu diesem Thema gibt es einen guten Artikel: Beziehungen zwischen Klassen (Objekten) . Es ist ein weiteres gutes Beispiel für Aggregation. Nehmen wir an, wir haben eine Klasse, Studentdie einen Schüler bezeichnet, und eine Klasse StudentsGroup(eine Gruppe von Schülern). Ein Student kann Mitglied eines Physikclubs, eines Star Wars-Studentenfanclubs oder eines KVN-Teams sein. Komposition ist eine strengere Art der Kommunikation. Bei der Verwendung von Komposition ist ein Objekt nicht nur Teil eines Objekts, sondern kann auch nicht zu einem anderen Objekt desselben Typs gehören. Das einfachste Beispiel ist ein Automotor. Ein Motor ist Teil eines Autos, kann aber nicht Teil eines anderen Autos sein. Wie Sie sehen, ist ihre Verbindung viel strenger als die von Carund Passengers. Beziehungen zwischen Klassen.  Vererbung, Zusammensetzung und Aggregation – 4
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION