Has-A İlişkisi
Coddy'nin Lua Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 49 / 70.
Bu kurs boyunca, sınıflar arasında davranış paylaşmak için kalıtımı kullandın: Bir Dog, bir Animal'dır. Ancak kalıtım her zaman doğru araç değildir.
Bazen nesneler bir aile ağacını paylaşmaz; bunun yerine bir nesne basitçe başka bir nesneyi içerir. Buna composition denir ve “has-a” ilişkisini modeller.
Bir araba düşün. Araba bir motor türü değildir. Bir motoru vardır. Motor, arabanın içinde bulunan ayrı bir nesnedir:
local Engine = {}
Engine.__index = Engine
function Engine:new(horsepower)
local obj = {horsepower = horsepower}
setmetatable(obj, Engine)
return obj
end
local Car = {}
Car.__index = Car
function Car:new(model, engine)
local obj = {
model = model,
engine = engine -- Engine nesnesini Car içinde sakla
}
setmetatable(obj, Car)
return obj
endBir araba oluştururken, mevcut bir motor nesnesini onun oluşturucusuna aktarırsınız:
local myEngine = Engine:new(200)
local myCar = Car:new("Sedan", myEngine)
print(myCar.engine.horsepower) -- 200Araba motordan kalıtım almaz. Basitçe motora bir başvuru tutar. Bu, her iki sınıfı da bağımsız tutar. Farklı bir motor kullanabilir veya aynı motor sınıfını bir motosiklette kullanabilirsin.
Composition, kalıtımın sağlayamadığı bir esneklik sunar: nesneleri katı bir aile hiyerarşisine kilitlemek yerine parçalardan bir araya getirirsiniz.
Görev
KolayKompozisyon kullanarak bir bilgisayar sistemi oluşturalım! Kalıtım yerine, içinde bir Computer bulunan bir CPU oluşturacaksın: böylece "has-a" ilişkisini göstereceksin.
Kodunu üç dosyaya ayıracaksın:
CPU.lua::new(brand, speed)kurucusuna sahip bir CPU sınıfı oluştur. Bu kurucu, marka adını ve GHz cinsinden hızı saklamalıdır.:getInfo()biçiminde bir dize döndüren bir{brand} @ {speed}GHzmetodu ekle.Computer.lua::new(model, cpu)kurucusu bir model adını ve bir CPU nesnesini kabul eden bir Computer sınıfı oluştur. Computer, CPU nesnesini kendi içinde saklar (kompozisyon!). Bilgisayarın modelini ve CPU'sunun bilgilerini yazdıran bir:describe()metodu ekle.main.lua: Her şeyi bir araya getir! CPU markası, CPU hızı ve bilgisayar modeli için girdileri oku. Önce bir CPU nesnesi oluştur, ardından bunu Computer kurucusuna aktar. Son olarak bilgisayarın:describe()metodunu çağır.
Üç girdi alacaksın:
- CPU markası (bir dize)
- GHz cinsinden CPU hızı (bir sayı)
- Bilgisayar modeli adı (bir dize)
Çıktın, içerdiği CPU'dan gelen bilgileri de içeren bilgisayar açıklamasını göstermelidir:
Model: {model}
CPU: {brand} @ {speed}GHzÖrneğin girdiler Intel, 3.5 ve WorkStation ise çıktı şöyle olmalıdır:
Model: WorkStation
CPU: Intel @ 3.5GHzComputer'ın CPU'dan kalıtım almadığına dikkat et. Computer yalnızca bir CPU'ya referans tutar. Computer'ın :describe() metodu, saklanan nesne üzerinden CPU'nun verilerine erişir; bu da kompozisyonun daha basit parçalardan karmaşık nesneler oluşturmanı nasıl sağladığını gösterir!
Kendin dene
-- main.lua
-- Kompozisyon kullanarak her şeyi bir araya getir
local CPU = require('CPU')
local Computer = require('Computer')
-- Girdileri oku
local cpuBrand = io.read()
local cpuSpeed = tonumber(io.read())
local computerModel = io.read()
-- TODO: Marka ve hız ile bir CPU nesnesi oluştur
-- TODO: Model ve CPU nesnesi ile bir Computer nesnesi oluştur
-- TODO: Çıktıyı yazdırmak için computer'ın describe() 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