Menu
Coddy logo textTech

Delegation

Teil des Abschnitts Objektorientierte Programmierung der Lua-Journey von Coddy. Lektion 50 von 70.

Ein Objekt in einem anderen Objekt zu speichern, ist nur der erste Schritt. Die wahre Stärke der Komposition entsteht durch Delegation, wenn das äußere Objekt Methodenaufrufe an seine inneren Komponenten weiterleitet.

Denke daran, ein Auto zu starten. Du greifst nicht unter die Motorhaube und drehst den Motor von Hand. Stattdessen drehst du den Schlüssel, und das Auto erledigt den Rest intern.

Im Code bedeutet das, dass die Klasse Car eine einfache Methode :start() bereitstellt, die die eigentliche Arbeit an den Motor delegiert:

function Car:start()
    print("Turning the key...")
    self.engine:run()  -- An das innere Objekt delegieren
end

Das Auto muss nicht wissen, wie der Motor läuft. Es weist den Motor lediglich an, seine Aufgabe zu erledigen. Dadurch bleiben die Zuständigkeiten getrennt. Die Klasse Engine kümmert sich um die Motorlogik, während Car die Komponenten koordiniert:

function Engine:run()
    print("Engine running at " .. self.horsepower .. " HP")
end

local engine = Engine:new(250)
local car = Car:new("Coupe", engine)
car:start()
-- Ausgabe:
-- Den Schlüssel drehen...
-- Motor läuft mit 250 HP

Delegation schafft eine klare Schnittstelle für die Benutzer deiner Klasse. Sie interagieren mit dem Auto, nicht mit seinen internen Teilen. Wenn du später eine andere Motorimplementierung einsetzt, bleibt die öffentliche Schnittstelle des Autos gleich: Nur die interne Delegation ändert sich.

challenge icon

Aufgabe

Einfach

Erstellen wir ein Musik-Player-System, das Delegation demonstriert! Du erstellst eine Speaker-Komponente und einen MusicPlayer, der sie enthält. Der Player übernimmt die Tonausgabe nicht direkt, sondern delegiert diese Verantwortung an seinen internen Lautsprecher.

Du organisierst deinen Code über drei Dateien:

  • Speaker.lua: Erstelle eine Speaker-Klasse mit einem Konstruktor :new(volume), der die Lautstärke speichert. Füge eine :playSound(trackName)-Methode hinzu, die Folgendes ausgibt: Playing "{trackName}" at volume {volume}
  • MusicPlayer.lua: Erstelle eine MusicPlayer-Klasse, deren Konstruktor :new(brand, speaker) einen Markennamen und ein Speaker-Objekt entgegennimmt. Der Player speichert den Lautsprecher in sich selbst. Füge diese Methoden hinzu:
    • :play(trackName): Gibt {brand} player starting... aus und delegiert dann an die :playSound()-Methode des Lautsprechers
    • :stop(): Gibt {brand} player stopped aus
  • main.lua: Führe alles zusammen! Lies die Eingaben für die Lautstärke des Lautsprechers, die Marke des Players und einen Titelnamen ein. Erstelle zuerst einen Speaker und übergib ihn dann an den MusicPlayer-Konstruktor. Rufe die :play()-Methode des Players mit dem Titelnamen auf und rufe anschließend :stop() auf.

Du erhältst drei Eingaben:

  1. Die Lautstärke des Lautsprechers (eine Zahl)
  2. Die Marke des Musik-Players (eine Zeichenkette)
  3. Der abzuspielende Titelname (eine Zeichenkette)

Deine Ausgabe sollte zeigen, wie der Player mit seinem Lautsprecher zusammenarbeitet:

{brand} player starting...
Playing "{trackName}" at volume {volume}
{brand} player stopped

Wenn die Eingaben beispielsweise 75, SoundMax und Summer Vibes lauten, sollte die Ausgabe wie folgt aussehen:

SoundMax player starting...
Playing "Summer Vibes" at volume 75
SoundMax player stopped

Beachte, dass der MusicPlayer nicht weiß, wie Töne erzeugt werden. Er weist seinen Lautsprecher einfach an, diesen Teil zu übernehmen. Das ist Delegation in Aktion: Das äußere Objekt stellt eine übersichtliche Schnittstelle bereit, während die innere Komponente die spezialisierte Arbeit erledigt!

Probier es selbst

-- main.lua
-- Alles zusammenbringen!

local Speaker = require('Speaker')
local MusicPlayer = require('MusicPlayer')

-- Eingaben lesen
local volume = tonumber(io.read())
local brand = io.read()
local trackName = io.read()

-- TODO: Erstelle einen Speaker mit der gegebenen Lautstärke

-- TODO: Erstelle einen MusicPlayer mit der Marke und dem Speaker

-- TODO: Rufe die play-Methode des Players mit dem Tracknamen auf

-- TODO: Rufe die stop-Methode des Players auf
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-Lua-Compiler