Alt Sınıf Metotları Ekleme
Coddy'nin Lua Journey'sinin Object Oriented Programming bölümünün bir parçası — ders 34 / 70.
Kalıtım, alt sınıfların üst sınıf metotlarına erişmesine olanak tanır, ancak asıl güç yalnızca alt sınıfa özgü yeni metotlar eklemekten gelir. Bir Dog, bir Animal'ın yapabildiği her şeyi yapabilir, artı olarak köpeklere özgü şeyler de yapabilir—havlamak gibi.
Alt sınıfa özgü bir metot eklemek basittir: sadece onu alt sınıf tablosunda tanımlayın. Örnekler metotları önce kendi sınıflarında aradıkları için, üst sınıfı etkilemeden yeni metodu bulacaklardır.
local Animal = {}
Animal.__index = Animal
function Animal:new(name)
local obj = {name = name}
setmetatable(obj, Animal)
return obj
end
function Animal:breathe()
print(self.name .. " is breathing")
end
-- Dog, Animal'dan miras alır
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
-- Sadece Dog'a özgü yeni metot
function Dog:bark()
print(self.name .. " says: Woof!")
endArtık Dog örnekleri hem kalıtım yoluyla alınan hem de benzersiz metotları kullanabilir:
local buddy = Dog:new("Buddy")
buddy:breathe() -- Çıktı: Buddy is breathing (kalıtım yoluyla alınan)
buddy:bark() -- Çıktı: Buddy says: Woof! (sadece alt sınıfa özgü)Üst sınıf değişmeden kalır; bu metot orada mevcut olmadığı için sıradan bir Animal üzerinde :bark() çağırmak başarısız olacaktır. Kalıtım, paylaşılan işlevselliği tek bir yerde tutarken davranışı bu şekilde özelleştirmenize olanak tanır.
Görev
KolayKedilerin kendilerine özgü yeteneklerinin olduğu bir evcil hayvan hiyerarşisi oluşturalım! Bir Pet ana sınıfı ve bir Cat alt sınıfı oluşturacaksınız; burada Cat, Pet'ten her şeyi miras alacak ancak aynı zamanda sadece kedilerin yapabileceği benzersiz bir metoda sahip olacak.
Kodunuzu üç dosya halinde düzenleyeceksiniz:
Pet.lua: Evcil hayvanın adını saklayan bir:new(name)yapıcı metodu (constructor) ile ana sınıfınızı tanımlayın. Evcil hayvanın adını ve ardındansays helloifadesini yazdıran bir:greet()metodu ekleyin. Standart sınıf yapısını kurun ve sınıfı döndürün (return).Cat.lua: Pet sınıfından miras alan alt sınıfınızı tanımlayın. Cat sınıfının:new(name)yapıcısı, adı başlatmak için ana sınıf yapıcısını çağırmalı, ardından metatabloyu Cat'e yeniden bağlamalıdır. Kedinin adını ve ardındanpurrs contentedlyifadesini yazdıran alt sınıfa özgü bir:purr()metodu ekleyin. Bu metot sadece Cat sınıfında bulunur; Pet sınıfında yoktur!main.lua: Cat modülünüzü dahil edin (require), girdiden bir isim okuyun, bir Cat örneği oluşturun ve hem miras alınan:greet()metodunu hem de kendine özgü:purr()metodunu kullanabildiğini gösterin.
Bir girdi alacaksınız: kedinin adı.
Ana dosyanızda, verilen isimle bir Cat oluşturun, ardından ayrı satırlarda önce :greet() sonra :purr() metodunu çağırın.
Örneğin, girdi Whiskers ise çıktı şu şekilde olmalıdır:
Whiskers says hello
Whiskers purrs contentedlyİlk satır Pet sınıfında tanımlanan ve miras alınan :greet() metodundan gelirken, ikinci satır sadece Cat sınıfında bulunan :purr() metodundan gelir. Bu, alt sınıfların ebeveynlerinin yapabildiği her şeyi ve ek olarak kendi özel davranışlarını nasıl yapabildiğini gösterir!
Kopya kağıdı
Alt sınıflar, tüm üst sınıf metotlarını miras almaya devam ederken, yalnızca kendilerine özgü yeni metotlar ekleyebilirler. Örnekler (instances), metotları önce kendi sınıflarında arar, ardından üst sınıfa (parent) başvurur.
Alt sınıfa özgü bir metot eklemek için, bunu alt sınıf tablosu üzerinde tanımlayın:
local Animal = {}
Animal.__index = Animal
function Animal:new(name)
local obj = {name = name}
setmetatable(obj, Animal)
return obj
end
function Animal:breathe()
print(self.name .. " is breathing")
end
-- Dog, Animal sınıfından miras alır
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
-- Alt sınıfa özgü metot
function Dog:bark()
print(self.name .. " says: Woof!")
endAlt sınıf örnekleri hem miras alınan hem de benzersiz metotları kullanabilir:
local buddy = Dog:new("Buddy")
buddy:breathe() -- Animal sınıfından miras alındı
buddy:bark() -- Yalnızca alt sınıfa özgü metotÜst sınıf bu durumdan etkilenmez; alt sınıfa özgü metotlara erişimi yoktur.
Kendin dene
-- main.lua: Bir Kedi oluşturun ve kalıtımı gösterin
local Cat = require('Cat')
-- Kedinin adını girdiden oku
local name = io.read()
-- YAPILACAK: Verilen isimle bir Kedi örneği oluşturun
-- YAPILACAK: Devralınan :greet() metodunu çağırın (Pet'ten)
-- YAPILACAK: Kediye özgü :purr() 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