Menu
Coddy logo textTech

Ü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")
end

Anahtar 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ıyor

Bu 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.

challenge icon

Görev

Kolay

Bir 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ından says hi ifadesini 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, önce Person.introduce(self) kullanarak üst sınıfın metodunu çağırın, ardından kişinin adını ve ardından bows politely ifadesini 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 politely

Buradaki 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
end

Metot 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
quiz iconKendini test et

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