Üst Sınıf Metotlarını Çağırma
Coddy'nin Lua Journey'sinin Object Oriented Programming bölümünün bir parçası — ders 38 / 70.
Bazen bir metodu tamamen geçersiz kılmak istediğiniz şey değildir. Bunun yerine, ebeveynin davranışını genişletmek isteyebilirsiniz—ebeveynin yaptığını yapıp ardından fazladan bir şeyler eklemek. Bunu başarmak için, ebeveyn metodunu doğrudan alt sınıfın (child) geçersiz kıldığı metodun içinden çağırabilirsiniz.
Bu teknik, üst sınıf adıyla nokta sözdizimini kullanır ve self ifadesini açıkça ilk argüman olarak iletir:
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
-- Dog, üst sınıf davranışını genişletir
local Dog = {}
Dog.__index = Dog
setmetatable(Dog, {__index = Animal})
function Dog:new(name)
local obj = Animal.new(Animal, name)
setmetatable(obj, Dog)
return obj
end
function Dog:speak()
Animal.speak(self) -- Önce üst sınıf metodunu çağır
print(self.name .. " wags tail happily")
endAnahtar satır Animal.speak(self) ifadesidir. Üst sınıfta nokta sözdizimini kullanarak ve self parametresini manuel olarak ileterek, kendi davranışımızı eklemeden önce orijinal metodu çağırırız:
local buddy = Dog:new("Buddy")
buddy:speak()
-- Çıktı:
-- Buddy bir ses çıkarıyor
-- Buddy mutlu bir şekilde kuyruk sallıyorBu desen, üst metot (parent method) kopyalamak istemediğiniz önemli bir iş yaptığında kullanışlıdır. Alt metot (child), üst metodun mantığını önce, sonra veya hatta kendi kodunun ortasında çalıştırabilir; bu da size davranışların nasıl birleşeceği üzerinde tam kontrol sağlar.
Görev
KolayBir FormalPerson sınıfının normal bir Person sınıfının davranışını genişlettiği bir selamlama sistemi kuralım! Bir kişinin kendisini nasıl tanıttığını tamamen değiştirmek yerine, resmi versiyon önce standart tanıtımı yapacak, ardından ekstra nazik bir dokunuş ekleyecektir.
Kodunuzu üç dosya halinde düzenleyeceksiniz:
Person.lua: Kişinin adını saklayan bir:new(name)kurucusuna sahip temel sınıfınız. Kişinin adını ve ardındansays hiifadesini yazdıran bir:introduce()metodu ekleyin. Bu, genişletilecek olan temel davranıştır.FormalPerson.lua: Person sınıfından miras alan bir alt sınıf. Kurucusu, adı işlemek için üst sınıfın kurucusunu çağırmalıdır.:introduce()metodunu geçersiz kılın (override), ancak üst sınıfın davranışını tamamen değiştirmek yerine, öncePerson.introduce(self)kullanarak üst sınıfın metodunu çağırın, ardından kişinin adını ve ardındanbows politelyifadesini içeren ek bir satır yazdırın.main.lua: FormalPerson modülünüzü dahil edin (require), girdiden bir isim okuyun, bir FormalPerson örneği oluşturun ve her iki davranışın birleşimini görmek için:introduce()metodunu çağırın.
Bir girdi alacaksınız: kişinin adı.
Bir FormalPerson üzerinde :introduce() metodunu çağırdığınızda, iki satırlık bir çıktı üretmelidir; ilki üst sınıfın metodundan, ikincisi ise alt sınıfın eklemesinden:
{name} says hi
{name} bows politelyÖrneğin, girdi Eleanor ise, çıktı şöyle olmalıdır:
Eleanor says hi
Eleanor bows politelyBuradaki temel nokta, FormalPerson'ın "says hi" mantığını tekrarlamamasıdır; bu işi üst sınıf metoduna devreder ve ardından kendi benzersiz davranışını üzerine ekler. Bu, kodunuzu temiz tutar ve alt sınıfların üst sınıf işlevselliğini değiştirmek yerine nasıl genişletebileceğini gösterir!
Kopya kağıdı
Bir üst sınıf (parent) metodunun davranışını tamamen geçersiz kılmak (override) yerine genişletmek için, alt sınıfın geçersiz kıldığı metodun içinden nokta sözdizimini kullanarak ve self ifadesini açıkça geçirerek üst sınıf metodunu çağırın:
function ChildClass:method()
ParentClass.method(self) -- Üst sınıf metodunu çağır
-- Ek davranış ekle
endMetot genişletmeyi gösteren tam örnek:
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
local Dog = {}
Dog.__index = Dog
setmetatable(Dog, {__index = Animal})
function Dog:new(name)
local obj = Animal.new(Animal, name)
setmetatable(obj, Dog)
return obj
end
function Dog:speak()
Animal.speak(self) -- Önce üst sınıf davranışını yürüt
print(self.name .. " wags tail happily") -- Alt sınıf davranışını ekle
end
local buddy = Dog:new("Buddy")
buddy:speak()
-- Output:
-- Buddy makes a sound
-- Buddy wags tail happilyÜst sınıf metodu herhangi bir noktada çağrılabilir: alt sınıfın kendi mantığından önce, sonra veya ortasında; bu da davranışların nasıl birleşeceği üzerinde tam kontrol sağlar.
Kendin dene
-- main.lua: Selamlama sistemi için giriş noktası
local FormalPerson = require('FormalPerson')
-- Kişinin adını girdiden oku
local name = io.read()
-- TODO: Verilen isimle bir FormalPerson örneği oluşturun
-- TODO: FormalPerson örneği üzerinde introduce 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