Metotları Geçersiz Kılma
Coddy'nin Lua Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 37 / 70.
Şimdiye kadar alt sınıflar, üst sınıf yöntemlerini miras aldı ve yenilerini ekledi. Peki ya bir alt sınıfın aynı yöntem adına ancak farklı davranışa ihtiyacı varsa? Buna yöntem geçersiz kılma denir.
Bir alt sınıfta, üst sınıftakilerden biriyle aynı ada sahip bir yöntem tanımladığınızda, alt sınıftaki sürüm öncelikli olur. Lua'nın arama zinciri önce alt sınıfı kontrol eder; yöntemi 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() 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!")
endArtık her sınıf aynı yöntem çağrısına farklı yanıt veriyor:
local generic = Animal:new("Creature")
local buddy = Dog:new("Buddy")
generic:speak() -- Çıktı: Creature bir ses çıkarır
buddy:speak() -- Çıktı: Buddy havlar: Woof!Dog örnekleri için Dog'un :speak() yöntemi, üst sınıfın sürümünün tamamen yerini alır. Bu, tutarlı bir arayüzü korurken özelleştirilmiş davranış oluşturmanı sağlar: her hayvan :speak() kullanabilir, ancak her tür bunu farklı şekilde yapar.
Görev
KolayFarklı yaratıkların kendilerine özgü şekillerde konuştuğu küçük bir hayvanlar âlemi oluşturalım! Bir Animal üst sınıfı ve her biri üst sınıfın Cat metodunu kendi özel davranışıyla geçersiz kılan iki alt sınıf, Cow ve :speak(), oluşturacaksın.
Kodunu dört dosyaya ayıracaksın:
Animal.lua: Hayvanın adını saklayan bir:new(name)kurucusuna sahip temel sınıfın. Hayvanın adının ardından:speak()yazdıran birmakes a soundmetodu ekle. Bu, alt sınıfların geçersiz kılacağı varsayılan davranıştır.Cat.lua: Animal'dan kalıtım alan bir alt sınıf.:new(name)kurucusu üst sınıfın kurucusunu çağırmalı, ardından metatablosunu Cat'e yeniden bağlamalıdır.:speak()metodunu, kedilerin farklı bir şey söylemesini sağlayacak şekilde geçersiz kıl: kedinin adının ardındanmeows: Meow!yazdır.Cow.lua: Animal'dan kalıtım alan başka bir alt sınıf. Kurucuyu Cat ile aynı şekilde oluştur.:speak()metodunu, ineklerin adlarının ardındanmoos: Moo!yazdırmasını sağlayacak şekilde geçersiz kıl.main.lua: Her şeyi bir araya getir! Girdiden iki ad oku, ilk adla bir Cat ve ikinci adla bir Cow oluştur, ardından aynı metodun sınıfa bağlı olarak farklı çıktılar ürettiğini göstermek için her birinde:speak()çağır.
İki girdi alacaksın:
- Kedinin adı
- İneğin adı
Ana dosyanda her iki hayvanı oluştur ve önce kedi, ardından inek üzerinde :speak() çağır.
Örneğin girdiler Whiskers ve Bessie ise çıktı şöyle olmalıdır:
Whiskers meows: Meow!
Bessie moos: Moo!Her iki hayvanın da aynı :speak() metodu çağrısına yanıt verdiğine, ancak her birinin kendi türüne özgü çıktı ürettiğine dikkat et. Cat'in sürümü, üst sınıfın genel "ses çıkarır" davranışının tamamen yerine geçer; Cow'un sürümü de aynı şekilde davranır. İşte eylem hâlindeki metod geçersiz kılma: aynı arayüz, farklı uygulamalar!
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 oluştur
-- TODO: İkinci isimle bir Cow oluştur
-- TODO: Önce cat üzerinde :speak() çağır, sonra cow üzerinde
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