Ein Auto hat einen Motor, es ist keiner
Komposition bedeutet, dass ein Objekt andere Objekte als Teile besitzt und ihnen Arbeit überlässt. Damit tauschen Sie ein Teil aus, ohne die Klasse umzubauen.
Ein Autohersteller baut Benziner und Elektroautos. Soll er für jede Mischung aus Motor und Karosserie eine eigene Klasse schreiben? Mit Teilen bleibt es bei wenigen kleinen Klassen.
Am Ende dieser Lektion
Notiz
Ich kann Komposition statt Vererbung wählen und den Grund nennen.
Schlüsselwörter
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Komposition | ein Objekt hält andere Objekte als Teile | |
| ist-ein | die Beziehung der Vererbung | ein Lastenrad ist ein Rad |
| hat-ein | die Beziehung der Komposition | ein Auto hat einen Motor |
| Delegieren | die Arbeit an ein Teilobjekt weitergeben | |
| Kopplung | wie stark eine Klasse von einer anderen abhängt |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Bei Komposition gilt der Satz „hat ein“
Vererbung drückt „ist ein“ aus, Komposition drückt „hat ein“ aus. Das Auto hat einen Motor. Ein Auto ist kein Motor.
Im Code steht das Teil als Attribut: self.motor. Die Methode reichweite_km des Autos delegiert, sie gibt die Frage an den Motor weiter und liefert dessen Antwort.
Ein Auto mit austauschbarem Motor
class Benzinmotor:
def reichweite_km(self, menge):
return menge * 15
class Elektromotor:
def reichweite_km(self, menge):
return menge * 6
class Auto:
def __init__(self, motor, menge):
self.motor = motor
self.menge = menge
def reichweite_km(self):
return self.motor.reichweite_km(self.menge)
def motor_wechseln(self, neuer_motor):
self.motor = neuer_motor
auto = Auto(Benzinmotor(), 40)
print(auto.reichweite_km())
auto.motor_wechseln(Elektromotor())
print(auto.reichweite_km())
# Ändern Sie die Menge 40 in 50 und starten Sie noch einmal.
Wie viele Klassen braucht welcher Weg
| Antriebe | Karosserien | Mit Vererbung | Mit Komposition |
|---|---|---|---|
| 2 | 3 | 6 Klassen, eine je Mischung | 5 Klassen: 2 plus 3 |
| 3 | 4 | 12 Klassen | 7 Klassen: 3 plus 4 |
| 4 | 5 | 20 Klassen | 9 Klassen: 4 plus 5 |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Ein häufiger Fehler
Warnung
Viele halten Vererbung für die einzige Art, Code zu teilen, und schreiben ElektroAuto(Benzinauto). Ein Elektroauto ist aber kein Sonderfall eines Benziners. Setzen Sie stattdessen den Motor als Teil ein und wechseln Sie ihn bei Bedarf.
Ein Teil lässt sich zur Laufzeit austauschen
Eine Unterklasse legen Sie beim Schreiben des Codes fest. Ein Teil dagegen kann sich ändern, während das Programm läuft: auto.motor_wechseln(Elektromotor()).
Dafür müssen die Teile dieselbe Methode anbieten, hier reichweite_km. Das Auto fragt nur nach dieser Methode und kennt nicht die Klasse des Teils. Das hält die Kopplung niedrig.
Ein Leuchtmittel im Lab austauschen
Im Lab bauen Sie eine Lampe, die ein Leuchtmittel hat. Die Glühbirne zieht 60 Watt, die LED 8 Watt. Die Lampe rechnet den Verbrauch in Wattstunden: Watt mal Stunden.
Bei fünf Stunden Betrieb erwarten Sie zuerst 300, nach dem Tausch der Birne gegen die LED 40.
Den Ordner anlegen
mkdir -p ~/oop-laborHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Hineingehen
cd ~/oop-laborHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Die Lampe mit zwei Leuchtmitteln schreiben
printf 'class Gluehbirne:\n def watt(self):\n return 60\n\nclass Led:\n def watt(self):\n return 8\n\nclass Lampe:\n def __init__(self, leuchtmittel):\n self.leuchtmittel = leuchtmittel\n\n def verbrauch_wh(self, stunden):\n return self.leuchtmittel.watt() * stunden\n\nlampe = Lampe(Gluehbirne())\nprint(lampe.verbrauch_wh(5))\nlampe.leuchtmittel = Led()\nprint(lampe.verbrauch_wh(5))\n' > lampe.pyHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Das Programm starten
python3 lampe.pyHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Die Lampe blieb dieselbe, nur das Teil wechselte
Die Klasse Lampe kennt weder die Glühbirne noch die LED. Sie ruft nur watt() auf. Ein drittes Leuchtmittel mit einer eigenen Methode watt passt ohne eine Änderung an der Lampe.
Mit Vererbung wäre dafür eine Unterklasse LedLampe nötig gewesen, und der Tausch zur Laufzeit ginge nicht.