Üst Sınıf Metotlarını Çağırma
Coddy'nin Lua Journey'sinin Nesne Yönelimli Programlama 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 ekstra bir şey eklemek. Bunu gerçekleştirmek için, çocuğun geçersiz kılma metodu içinden ebeveyn metodunu doğrudan çağırabilirsiniz.
Teknik, üst sınıf adıyla nokta sözdizimini kullanır ve ilk bağımsız değişken olarak self değerini açıkça geçirir:
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) satırıdır. Üst sınıf üzerinde nokta söz dizimini kullanıp self değerini manuel olarak geçirerek, kendi davranışımızı eklemeden önce özgün yöntemi çağırırız:
local buddy = Dog:new("Buddy")
buddy:speak()
-- Çıktı:
-- Buddy bir ses çıkarır
-- Buddy kuyruğunu mutlu bir şekilde sallarBu kalıp, yinelemek istemediğiniz önemli işleri üst yöntem yaptığında kullanışlıdır. Alt sınıf, üst sınıfın mantığını kendi kodundan önce, sonra veya hatta ortasında çalıştırabilir; böylece davranışların nasıl birleşeceği üzerinde tam denetim sahibi olursunuz.
Görev
KolayBir FormalPerson'ın normal bir Person'ın davranışını genişlettiği bir selamlama sistemi oluşturalım! Bir kişinin kendini tanıtma biçimini tamamen değiştirmek yerine, resmî sürüm önce standart tanıtımı yapacak, ardından fazladan kibar bir dokunuş ekleyecek.
Kodunu üç dosyaya ayıracaksın:
Person.lua: Kişinin adını saklayan:new(name)kurucusuna sahip temel sınıfın. Kişinin adının ardından:introduce()yazdıran birsays himetodu ekle. Bu, genişletilecek temel davranıştır.FormalPerson.lua: Person'dan miras alan bir alt sınıf. Kurucusu, adı işlemek için üst sınıfın kurucusunu çağırmalı.:introduce()metodunu geçersiz kıl; 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, ardından kişinin adının ardındanbows politelyyazdıran ek bir satır yazdır.main.lua: FormalPerson modülünü içe aktar, girdiden bir ad oku, bir FormalPerson örneği oluştur ve her iki davranışın birleşimini görmek için:introduce()metodunu çağır.
Bir girdi alacaksın: kişinin adı.
Bir FormalPerson üzerinde :introduce() metodunu çağırdığında iki satır çıktı üretmelidir: ilki üst sınıfın metodundan, ikincisi alt sınıfın eklediği davranıştan:
{name} says hi
{name} bows politelyÖrneğin, girdi Eleanor ise çıktı şöyle olmalıdır:
Eleanor says hi
Eleanor bows politelyBuradaki temel fikir, FormalPerson'ın "says hi" mantığını tekrarlamamasıdır. Bu işi üst sınıfın metoduna devreder, ardından kendi benzersiz davranışını üzerine ekler. Böylece kodun temiz kalır ve alt sınıfların üst sınıf işlevselliğini değiştirmek yerine nasıl genişletebildiğini gösterir!
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 adla bir FormalPerson örneği oluştur
-- TODO: FormalPerson örneğinde introduce 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şisiKendi başına pratik yap: Online Lua derleyicisi