Metotları Geçersiz Kılma
Coddy'nin Lua Journey'sinin Object Oriented Programming bölümünün bir parçası — ders 37 / 70.
Şu ana kadar, alt sınıflar ebeveyn metotlarını miras aldı ve yenilerini ekledi. Peki ya bir alt sınıfın aynı metot ismine sahip farklı bir davranışa ihtiyacı olursa? Buna metot geçersiz kılma (method overriding) denir.
Bir alt sınıfta, üst sınıftaki bir metotla aynı ada sahip bir metot tanımladığınızda, alt sınıfın sürümü öncelik kazanır. Lua'nın arama zinciri önce alt sınıfı kontrol eder; eğer metodu orada bulursa, aramayı durdurur.
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, speak() fonksiyonunu geçersiz kılar (override eder)
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()
print(self.name .. " barks: Woof!")
endArtık her sınıf aynı metot çağrısına farklı şekilde yanıt verir:
local generic = Animal:new("Creature")
local buddy = Dog:new("Buddy")
generic:speak() -- Çıktı: Creature bir ses çıkarıyor
buddy:speak() -- Çıktı: Buddy havlıyor: Woof!Dog'un :speak() metodu, Dog örnekleri için ebeveynin sürümünün tamamen yerini alır. Bu, tutarlı bir arayüzü korurken özelleştirilmiş davranışlar oluşturmanıza olanak tanır—her hayvan :speak() yapabilir, ancak her tür bunu farklı şekilde yapar.
Görev
KolayFarklı canlıların kendilerine özgü şekillerde konuştuğu küçük bir hayvanlar alemi kuralım! Bir Animal ana sınıfı ve her biri ebeveynin :speak() metodunu kendi özel davranışıyla geçersiz kılan (override) iki alt sınıf —Cat ve Cow— oluşturacaksınız.
Kodunuzu dört dosya halinde düzenleyeceksiniz:
Animal.lua: Hayvanın adını saklayan bir:new(name)yapıcı metoduna (constructor) sahip temel sınıfınız. Hayvanın adını ve ardındanmakes a soundifadesini yazdıran bir:speak()metodu ekleyin. Bu, alt sınıfların geçersiz kılacağı varsayılan davranıştır.Cat.lua: Animal sınıfından miras alan bir alt sınıf.:new(name)yapıcı metodu ebeveyn yapıcıyı çağırmalı, ardından metatabloyu Cat'e yeniden bağlamalıdır. Kedilerin farklı bir şey söylemesi için:speak()metodunu geçersiz kılın — kedinin adını ve ardındanmeows: Meow!ifadesini yazdırın.Cow.lua: Animal sınıfından miras alan başka bir alt sınıf. Yapıcı metodu Cat ile aynı şekilde kurun. İneklerin adlarını ve ardındanmoos: Moo!ifadesini yazdırması için:speak()metodunu geçersiz kılın.main.lua: Her şeyi bir araya getirin! Girdiden iki isim okuyun, ilk isimle bir Cat ve ikinci isimle bir Cow oluşturun, ardından aynı metod isminin sınıfa bağlı olarak nasıl farklı çıktılar ürettiğini göstermek için her biri üzerinde:speak()metodunu çağırın.
İki girdi alacaksınız:
- Kedinin adı
- İneğin adı
Ana dosyanızda her iki hayvanı da oluşturun ve önce kedi, sonra inek üzerinde :speak() metodunu çağırın.
Örneğin, girdiler Whiskers ve Bessie ise, çıktı şu şekilde olmalıdır:
Whiskers meows: Meow!
Bessie moos: Moo!Her iki hayvanın da aynı :speak() metod çağrısına nasıl yanıt verdiğine, ancak her birinin kendi türüne özgü çıktı ürettiğine dikkat edin. Cat versiyonu ebeveynin genel "makes a sound" davranışını tamamen değiştirir, Cow versiyonu da öyle. Bu, iş başındaki metod geçersiz kılmadır (method overriding) — aynı arayüz, farklı uygulamalar!
Kopya kağıdı
Metot geçersiz kılma (method overriding), bir alt sınıfın üst sınıftaki bir metotla aynı isme sahip bir metot tanımlamasına olanak tanıyarak, üst sınıfın davranışını özelleştirilmiş bir işlevsellikle değiştirmesini sağlar.
Lua bir metodu aradığında, önce alt sınıfı kontrol eder. Eğer metodu orada bulursa, o sürümü kullanır ve üst sınıfta aramayı durdurur.
Metot geçersiz kılmaya temel bir ö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
-- Dog, speak() metodunu geçersiz kılar
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()
print(self.name .. " barks: Woof!")
endGeçersiz kılınan metodun kullanımı:
local generic = Animal:new("Creature")
local buddy = Dog:new("Buddy")
generic:speak() -- Output: Creature makes a sound
buddy:speak() -- Output: Buddy barks: Woof!Alt sınıfın metodu, o alt sınıfın örnekleri için üst sınıfın sürümünü tamamen değiştirir; bu da tüm sınıflar arasında tutarlı bir arayüz sağlarken özelleştirilmiş davranışlara olanak tanır.
Kendin dene
-- main.lua: Her şeyi bir araya getir
local Cat = require('Cat')
local Cow = require('Cow')
-- Girdiyi oku
local catName = io.read()
local cowName = io.read()
-- TODO: İlk isimle bir Cat (Kedi) oluştur
-- TODO: İkinci isimle bir Cow (İnek) oluştur
-- TODO: Önce kedi üzerinde, sonra inek üzerinde :speak() metodunu çağı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