Kalıtım Kurulumu
Coddy'nin Lua Journey'sinin Object Oriented Programming bölümünün bir parçası — ders 31 / 70.
Şimdiye kadar, her nesnenin yöntemleri tek bir prototip tablosunda aradığı sınıflar oluşturdunuz. Peki ya bir sınıfın diğeri üzerine inşa edilmesini isterseniz? İşte burada kalıtım (inheritance) devreye girer; bir alt sınıf, kendi özelliklerini eklerken bir üst sınıftaki her şeye erişebilir.
Temel içgörü, bir sınıf tablosunun kendisinin de bir metatabloya sahip olabilmesidir. Lua, alt sınıfta (child class) bir şey bulamadığında, alt sınıfın metatablosundaki __index alanına bakar; bu alan da üst sınıfı (parent class) işaret eder.
-- Üst sınıf
local Animal = {}
Animal.__index = Animal
function Animal:new()
local obj = {}
setmetatable(obj, Animal)
return obj
end
function Animal:breathe()
print("Breathing...")
endİşte kalıtım kurulumu. Bir alt sınıf oluşturuyoruz ve metatablosunu üst sınıfa bakacak şekilde ayarlıyoruz:
-- Alt sınıf
local Dog = {}
Dog.__index = Dog
setmetatable(Dog, {__index = Animal})Bu tek satır—setmetatable(Dog, {__index = Animal})—kalıtım bağlantısını oluşturur. Bir Dog örneği, Dog içinde bulunmayan bir metodu çağırdığında, Lua Animal'ı kontrol eder.
Arama zinciri şu şekilde çalışır: örnek → Dog → Animal. Her adım, aranacak bir sonraki tabloyu bulmak için __index kullanır. Bu, alt sınıfların tüm üst sınıf metotlarını kopyalamadan otomatik olarak devralmasını sağlar.
Görev
Kolayİlk kalıtım hiyerarşinizi oluşturalım! Bir Machine sınıfının temel görevi gördüğü ve bir Robot sınıfının ondan miras aldığı basit bir ebeveyn-çocuk sınıf ilişkisi oluşturacaksınız.
Kodunuzu üç dosya halinde düzenleyeceksiniz:
Machine.lua: Standart sınıf modelini kullanarak ebeveyn sınıfınızı tanımlayın. Bir:new()yapıcı metodu (constructor) veMachine is operationalyazdıran bir:status()metodu ekleyin.__indexyapısını kurmayı ve dosyanın sonunda sınıfı döndürmeyi unutmayın.Robot.lua: Machine sınıfından miras alan çocuk sınıfınızı tanımlayın. Machine modülünü require ile dahil edin, Robot tablosunu kendi__indexyapısıyla kurun vesetmetatable(Robot, {__index = Machine})kullanarak kalıtım bağlantısını oluşturun. Robot'u metatablosu olarak kullanan bir örnek (instance) oluşturan bir:new()yapıcı metodu ekleyin.main.lua: Robot modülünüzü require ile dahil ederek, bir Robot örneği oluşturarak ve miras alınan:status()metodunu çağırarak her şeyi bir araya getirin.
Buradaki temel kavram, Robot sınıfınızın :status() metodunu kendisinin tanımlamamasıdır; bu metodu metatablo zinciri aracılığıyla Machine sınıfından miras alır. Bir Robot örneği üzerinde :status() metodunu çağırdığınızda, Lua önce Robot içinde arayacak, bulamayacak ve ardından __index bağlantısını takip ederek metodu keşfedeceği Machine sınıfına gidecektir.
Çıktınız şu şekilde olmalıdır:
Machine is operationalBu tek satır, kalıtımın çalıştığını kanıtlar; Robot'unuz, yalnızca ebeveyn sınıfında tanımlanmış bir metoda başarıyla erişti!
Kopya kağıdı
Lua'da kalıtım oluşturmak için, bir sınıf tablosunun metatablosunu __index kullanarak üst sınıfı işaret edecek şekilde ayarlayın:
-- Üst sınıf
local Animal = {}
Animal.__index = Animal
function Animal:new()
local obj = {}
setmetatable(obj, Animal)
return obj
end
function Animal:breathe()
print("Breathing...")
end
-- Alt sınıf
local Dog = {}
Dog.__index = Dog
setmetatable(Dog, {__index = Animal})Kalıtım bağlantısı setmetatable(Dog, {__index = Animal}) ile oluşturulur. Bu, Dog örneklerinin Animal metotlarına otomatik olarak erişmesini sağlar.
Arama zinciri şu sırayı takip eder: örnek → Alt sınıf → Üst sınıf. Her adım, aranacak bir sonraki tabloyu bulmak için __index kullanır.
Kendin dene
-- main.lua: Her şeyi bir araya getirin
-- YAPILACAK: Robot modülünü dahil edin (require)
-- YAPILACAK: Robot:new() kullanarak bir Robot örneği oluşturun
-- YAPILACAK: Robot örneğinizde kalıtılan :status() metodunu çağırın
-- Bu, "Machine is operational" yazdırmalıdır
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Object Oriented Programming 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şisi