Menu
Coddy logo textTech

Delegowanie

Część sekcji Programowanie obiektowe ścieżki Lua w Coddy. Lekcja 50 z 70.

Przechowywanie obiektu wewnątrz innego obiektu to dopiero pierwszy krok. Prawdziwa siła kompozycji wynika z delegowania, gdy zewnętrzny obiekt przekazuje wywołania metod swoim wewnętrznym komponentom.

Pomyśl o uruchamianiu samochodu. Nie sięgasz pod maskę, żeby ręcznie obracać silnikiem. Zamiast tego przekręcasz kluczyk, a samochód zajmuje się resztą wewnętrznie.

W kodzie oznacza to, że klasa Car udostępnia prostą metodę :start(), która deleguje właściwą pracę do silnika:

function Car:start()
    print("Turning the key...")
    self.engine:run()  -- Deleguj do obiektu wewnętrznego
end

Samochód nie musi wiedzieć, jak działa silnik. Po prostu mówi silnikowi, żeby wykonywał swoją pracę. Dzięki temu obowiązki są rozdzielone. Klasa Engine obsługuje logikę silnika, a Car koordynuje poszczególne elementy:

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

local engine = Engine:new(250)
local car = Car:new("Coupe", engine)
car:start()
-- Wynik:
-- Przekręcanie kluczyka...
-- Silnik pracuje z mocą 250 HP

Delegowanie tworzy przejrzysty interfejs dla użytkowników Twojej klasy. Wchodzą w interakcję z samochodem, a nie z jego wewnętrznymi częściami. Jeśli później zamienisz silnik na inną implementację, publiczny interfejs samochodu pozostanie taki sam — zmieni się tylko wewnętrzne delegowanie.

challenge icon

Wyzwanie

Łatwy

Zbudujmy system odtwarzacza muzyki, który pokazuje delegowanie! Utworzysz komponent Speaker oraz MusicPlayer, który go zawiera. Odtwarzacz nie będzie bezpośrednio obsługiwać odtwarzania dźwięku, lecz przekaże tę odpowiedzialność swojemu wewnętrznemu głośnikowi.

Rozmieścisz swój kod w trzech plikach:

  • Speaker.lua: Utwórz klasę Speaker z konstruktorem :new(volume), który przechowuje poziom głośności. Dodaj metodę :playSound(trackName), która wyświetla: Playing "{trackName}" at volume {volume}
  • MusicPlayer.lua: Utwórz klasę MusicPlayer, której konstruktor :new(brand, speaker) przyjmuje nazwę marki i obiekt Speaker. Odtwarzacz przechowuje w sobie głośnik. Dodaj następujące metody:
    • :play(trackName): wyświetla {brand} player starting..., a następnie przekazuje zadanie metodzie :playSound() głośnika
    • :stop(): wyświetla {brand} player stopped
  • main.lua: Połącz wszystko! Wczytaj dane wejściowe: głośność głośnika, markę odtwarzacza i nazwę utworu. Najpierw utwórz Speaker, a następnie przekaż go do konstruktora MusicPlayer. Wywołaj metodę :play() odtwarzacza, podając nazwę utworu, a następnie wywołaj :stop().

Otrzymasz trzy dane wejściowe:

  1. Głośność głośnika (liczba)
  2. Marka odtwarzacza muzyki (ciąg znaków)
  3. Nazwa utworu do odtworzenia (ciąg znaków)

Wynik powinien pokazywać, jak odtwarzacz współpracuje ze swoim głośnikiem:

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

Na przykład, jeśli dane wejściowe to 75, SoundMax i Summer Vibes, wynik powinien wyglądać tak:

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

Zwróć uwagę, że MusicPlayer nie wie, jak wytwarzać dźwięk. Po prostu poleca swojemu głośnikowi zająć się tą częścią. Tak właśnie działa delegowanie: obiekt zewnętrzny udostępnia przejrzysty interfejs, a komponent wewnętrzny wykonuje specjalistyczną pracę!

Spróbuj swoich sił

-- main.lua
-- Połącz wszystko w całość!

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

-- Odczytaj dane wejściowe
local volume = tonumber(io.read())
local brand = io.read()
local trackName = io.read()

-- TODO: Utwórz Speaker z podaną głośnością

-- TODO: Utwórz MusicPlayer z podaną marką i obiektem Speaker

-- TODO: Wywołaj metodę play obiektu MusicPlayer, przekazując nazwę utworu

-- TODO: Wywołaj metodę stop obiektu MusicPlayer
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator Lua online