Delegasyon
Coddy'nin Lua Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 50 / 70.
Bir nesneyi başka bir nesnenin içinde saklamak yalnızca ilk adımdır. Birleştirmenin asıl gücü, dış nesnenin yöntem çağrılarını iç bileşenlerine ilettiği delegation işleminden gelir.
Bir arabayı çalıştırmayı düşünün. Kaputun altına uzanıp motoru elle döndürmezsiniz. Bunun yerine anahtarı çevirirsiniz ve araba geri kalanını kendi içinde halleder.
Kodda bu, Car sınıfının gerçek işi motora devreden basit bir :start() yöntemi sağladığı anlamına gelir:
function Car:start()
print("Turning the key...")
self.engine:run() -- İç nesneye devret
endArabanın motorun nasıl çalıştığını bilmesine gerek yoktur. Motoruna yalnızca görevini yapmasını söyler. Bu, sorumlulukların birbirinden ayrılmasını sağlar. Engine sınıfı motor mantığını yönetirken Car parçaları koordine eder:
function Engine:run()
print("Engine running at " .. self.horsepower .. " HP")
end
local engine = Engine:new(250)
local car = Car:new("Coupe", engine)
car:start()
-- Çıktı:
-- Anahtarı çeviriyor...
-- Motor 250 HP'de çalışıyorYetkilendirme, sınıfınızın kullanıcıları için temiz bir arayüz oluşturur. Kullanıcılar sınıfın iç parçalarıyla değil, arabayla etkileşime girer. Daha sonra farklı bir motor uygulamasıyla değiştirseniz bile arabanın herkese açık arayüzü aynı kalır: yalnızca dahili yetkilendirme değişir.
Görev
KolayDelegation'ı gösteren bir müzik çalar sistemi oluşturalım! Bir Speaker bileşeni ve bunu içeren bir MusicPlayer oluşturacaksın. Çalar, ses çıkışını doğrudan yönetmeyecek; bunun yerine bu sorumluluğu kendi içindeki hoparlöre devredecek.
Kodunu üç dosyaya ayıracaksın:
Speaker.lua: Ses düzeyini saklayan,:new(volume)yapıcısına sahip bir Speaker sınıfı oluştur. Şunu yazdıran bir:playSound(trackName)metodu ekle:Playing "{trackName}" at volume {volume}MusicPlayer.lua: Yapıcısı:new(brand, speaker)bir marka adını ve bir Speaker nesnesini kabul eden bir MusicPlayer sınıfı oluştur. Çalar, hoparlörü kendi içinde saklar. Şu metotları ekle::play(trackName): Önce{brand} player starting...yazdırır, ardından hoparlörün:playSound()metoduna devreder:stop():{brand} player stoppedyazdırır
main.lua: Her şeyi bir araya getir! Hoparlör ses düzeyi, çalar markası ve parça adı için girdileri oku. Önce bir Speaker oluştur, ardından bunu MusicPlayer yapıcısına aktar. Çaların:play()metodunu parça adıyla çağır, sonra:stop()metodunu çağır.
Üç girdi alacaksın:
- Hoparlör ses düzeyi (bir sayı)
- Müzik çalar markası (bir dize)
- Çalınacak parçanın adı (bir dize)
Çıktın, çaların hoparlörle koordinasyon kurduğunu göstermeli:
{brand} player starting...
Playing "{trackName}" at volume {volume}
{brand} player stoppedÖrneğin girdiler 75, SoundMax ve Summer Vibes ise çıktı şöyle olmalı:
SoundMax player starting...
Playing "Summer Vibes" at volume 75
SoundMax player stoppedMusicPlayer'ın sesin nasıl üretileceğini bilmediğine dikkat et. Yalnızca bu kısmı yönetmesi için hoparlörüne söyler. Bu, delegation'ın iş başındaki hâlidir: dış nesne temiz bir arayüz sağlarken iç bileşen özel işi yapar!
Kendin dene
-- main.lua
-- Her şeyi bir araya getir!
local Speaker = require('Speaker')
local MusicPlayer = require('MusicPlayer')
-- Girdileri oku
local volume = tonumber(io.read())
local brand = io.read()
local trackName = io.read()
-- TODO: Verilen volume ile bir Speaker oluştur
-- TODO: brand ve speaker ile bir MusicPlayer oluştur
-- TODO: track name ile player'ın play metodunu çağır
-- TODO: player'ın stop metodunu çağır
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1'Self' Kavramı
Fonksiyonlu TablolarAçık 'self'İki Nokta SözdizimiNokta vs İki NoktaÖzet - Hareket Eden Nokta4Proje: Dijital Banka
Proje KurulumuPara Yatırma Metodu7Çok Biçimlilik ve Geçersiz Kılma
Metotları Geçersiz KılmaÜst Sınıf Metotlarını ÇağırmaDuck TypingOrtak ArayüzTür KontrolüÖzet - Çalışan Rolleri2Sınıf Prototip Kalıbı
Prototip Kavramı__index ile Bağlama:new() KurucusuÖznitelikleri BaşlatmaBağımsız ÖrneklerÖzet - Araba Fabrikası5OOP'de Operatör Aşırı Yükleme
Nesneleri ToplamaNesneleri ÇıkarmaNesneleri BirleştirmeNesneleri Karşılaştırma (<, >)Özet - Cüzdan Matematiği8Kapsülleme
Adlandırma KurallarıGizlilik için Closure'larClosure'lar Aracılığıyla ErişimSalt Okunur TablolarDoğrulama MantığıÖzet - Güvenli Kasa11Tasarım Kalıpları (Lite)
Fabrika FonksiyonlarıSingleton TablosuIterator KalıbıObserver (Dinleyici)Özet - Logger Fabrikası3Nesne Durumu ve Davranışı
Örnek DeğişkenleriGetter MetotlarıSetter MetotlarıHesaplanmış ÖzelliklerString BiçimlendirmeEşitlik KontrolleriÖzet - Öğrenci Notu6Kalıtımın Temelleri
Kalıtım KurulumuMetot KalıtımıConstructor'ı GenişletmeAlt Sınıf Metotları EklemePaylaşılan ve BenzersizÖzet - Şekil Hiyerarşisi9Kompozisyon ve Mixin'ler
Has-A İlişkisiDelegasyonBasit Mixin'lerBirden Fazla Mixin UygulamaMixin'ler ve KalıtımÖzet - Robot BirleştirmeKendi başına pratik yap: Online Lua derleyicisi