Metot Kalıtımı
Coddy'nin Lua Journey'sinin Object Oriented Programming bölümünün bir parçası — ders 32 / 70.
Kalıtım bağı kurulduğunda, alt sınıf örnekleri tüm üst sınıf metotlarına otomatik olarak erişim kazanır. Bu, Lua'nın arama zinciri aracılığıyla gerçekleşir; bir örnek üzerinde bir metot çağırdığınızda, Lua aradığınız şeyi bulana kadar her bir bağlı tabloyu tarar.
Animal'ın bir :breathe() metodu tanımladığı şu kurulumu ele alalım:
local Animal = {}
Animal.__index = Animal
function Animal:new()
local obj = {}
setmetatable(obj, Animal)
return obj
end
function Animal:breathe()
print("Breathing...")
end
-- Dog, Animal'dan miras alır
local Dog = {}
Dog.__index = Dog
setmetatable(Dog, {__index = Animal})
function Dog:new()
local obj = {}
setmetatable(obj, Dog)
return obj
endŞimdi bir Dog oluşturduğumuzda ve üst sınıfın metodunu çağırdığımızda ne olacağını görün:
local buddy = Dog:new()
buddy:breathe() -- Çıktı: Nefes alıyor...Dog sınıfı hiçbir zaman :breathe() metodunu tanımlamadı, ancak yine de çalışıyor. Lua önce buddy nesnesini kontrol eder, hiçbir şey bulamaz, sonra Dog sınıfını kontrol eder, yine bir şey bulamaz ve son olarak onu Animal içinde bulur. Bu otomatik metot kalıtımı, paylaşılan davranışı ebeveyn sınıfta bir kez yazdığınız ve her alt sınıfın bundan anında yararlandığı anlamına gelir.
Görev
KolayMetot kalıtımını iş başında görmek için basit bir canlı hiyerarşisi oluşturalım! Bir Animal üst sınıfı ve bir Dog alt sınıfı oluşturacak, ardından Dog örneklerinin yalnızca Animal içinde tanımlanmış metotları kullanabildiğini göstereceksiniz.
Kodunuzu üç dosya halinde düzenleyeceksiniz:
Animal.lua: Standart sınıf modelini kullanarak üst sınıfınızı tanımlayın. Hayvanın adını saklayan bir:new(name)yapıcı metodu (constructor) ve hayvanın adını ve ardındanmakes a soundifadesini yazdıran bir:speak()metodu ekleyin. Dosyanın sonunda sınıfı döndürün.Dog.lua: Animal sınıfından miras alan alt sınıfınızı tanımlayın. Animal modülünü dahil edin (require) ve Dog'un Animal metotlarına erişebilmesi için kalıtım bağlantısını kurun. İsmi saklayan ve Dog'u metatable olarak ayarlayan bir:new(name)yapıcı metodu ekleyin. Dog sınıfı kendi:speak()metodunu TANIMLAMAMALIDIR; bunu Animal sınıfından miras alacaktır.main.lua: Dog modülünüzü dahil edin, girdiden bir isim okuyun, bu isimle bir Dog örneği oluşturun ve üzerinde:speak()metodunu çağırın.
Bir girdi alacaksınız: köpeğin adı.
Örneğin, girdi Buddy ise, çıktı şu şekilde olmalıdır:
Buddy makes a soundBuradaki sihir, Dog sınıfınızın hiçbir zaman :speak() metodunu tanımlamamasına rağmen, bir Dog örneği üzerinde bu metodu çağırmanın mükemmel çalışmasıdır. Lua, arama zincirini Dog örneğinden Dog sınıfına, ardından metodu bulduğu Animal sınıfına kadar takip eder. İşte bu, kalıtımın işleyişidir!
Kopya kağıdı
Alt sınıf örnekleri, Lua'nın arama zinciri (lookup chain) aracılığıyla tüm üst sınıf metotlarına otomatik olarak erişim kazanır. Bir örnek üzerinde bir metot çağrıldığında, Lua metodu bulana kadar her bir bağlı tabloyu arar.
Kalıtımı Ayarlama
Üst sınıf tanımı:
local Animal = {}
Animal.__index = Animal
function Animal:new()
local obj = {}
setmetatable(obj, Animal)
return obj
end
function Animal:breathe()
print("Breathing...")
endKalıtım bağlantısı olan alt sınıf:
local Dog = {}
Dog.__index = Dog
setmetatable(Dog, {__index = Animal})
function Dog:new()
local obj = {}
setmetatable(obj, Dog)
return obj
endKalıtılan Metotları Kullanma
Alt sınıf örnekleri, alt sınıfta tanımlanmamış olsa bile üst sınıf metotlarını çağırabilir:
local buddy = Dog:new()
buddy:breathe() -- Çıktı: Breathing...Arama zinciri: Lua, metot bulunana kadar buddy → Dog → Animal sırasını kontrol eder.
Çoklu Dosya Sınıf Organizasyonu
Üst sınıf dosyası (Animal.lua):
local Animal = {}
Animal.__index = Animal
function Animal:new(name)
local obj = {name = name}
setmetatable(obj, Animal)
return obj
end
function Animal:speak()
print(self.name .. " makes a sound")
end
return AnimalAlt sınıf dosyası (Dog.lua):
local Animal = require("Animal")
local Dog = {}
Dog.__index = Dog
setmetatable(Dog, {__index = Animal})
function Dog:new(name)
local obj = {name = name}
setmetatable(obj, Dog)
return obj
end
return DogAna dosya kullanımı:
local Dog = require("Dog")
local buddy = Dog:new("Buddy")
buddy:speak() -- Çıktı: Buddy makes a soundKendin dene
-- main.lua: Giriş noktası
local Dog = require('Dog')
-- Köpeğin adını girdiden oku
local name = io.read()
-- YAPILACAK: Verilen isimle bir Dog örneği oluşturun
-- YAPILACAK: Köpek örneği üzerinde :speak() metodunu çağırın
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