Menu
Coddy logo textTech

Metot Kalıtımı

Coddy'nin Lua Journey'sinin Object Oriented Programming bölümünün bir parçası — ders 32 / 70.

Kalıtım bağı kurulduğunda, alt sınıf örnekleri tüm üst sınıf metotlarına otomatik olarak erişim kazanır. Bu, Lua'nın arama zinciri aracılığıyla gerçekleşir; bir örnek üzerinde bir metot çağırdığınızda, Lua aradığınız şeyi bulana kadar her bir bağlı tabloyu tarar.

Animal'ın bir :breathe() metodu tanımladığı şu kurulumu ele alalım:

local Animal = {}
Animal.__index = Animal

function Animal:new()
    local obj = {}
    setmetatable(obj, Animal)
    return obj
end

function Animal:breathe()
    print("Breathing...")
end

-- Dog, Animal'dan miras alır
local Dog = {}
Dog.__index = Dog
setmetatable(Dog, {__index = Animal})

function Dog:new()
    local obj = {}
    setmetatable(obj, Dog)
    return obj
end

Şimdi bir Dog oluşturduğumuzda ve üst sınıfın metodunu çağırdığımızda ne olacağını görün:

local buddy = Dog:new()
buddy:breathe()  -- Çıktı: Nefes alıyor...

Dog sınıfı hiçbir zaman :breathe() metodunu tanımlamadı, ancak yine de çalışıyor. Lua önce buddy nesnesini kontrol eder, hiçbir şey bulamaz, sonra Dog sınıfını kontrol eder, yine bir şey bulamaz ve son olarak onu Animal içinde bulur. Bu otomatik metot kalıtımı, paylaşılan davranışı ebeveyn sınıfta bir kez yazdığınız ve her alt sınıfın bundan anında yararlandığı anlamına gelir.

challenge icon

Görev

Kolay

Metot kalıtımını iş başında görmek için basit bir canlı hiyerarşisi oluşturalım! Bir Animal üst sınıfı ve bir Dog alt sınıfı oluşturacak, ardından Dog örneklerinin yalnızca Animal içinde tanımlanmış metotları kullanabildiğini göstereceksiniz.

Kodunuzu üç dosya halinde düzenleyeceksiniz:

  • Animal.lua: Standart sınıf modelini kullanarak üst sınıfınızı tanımlayın. Hayvanın adını saklayan bir :new(name) yapıcı metodu (constructor) ve hayvanın adını ve ardından makes a sound ifadesini yazdıran bir :speak() metodu ekleyin. Dosyanın sonunda sınıfı döndürün.
  • Dog.lua: Animal sınıfından miras alan alt sınıfınızı tanımlayın. Animal modülünü dahil edin (require) ve Dog'un Animal metotlarına erişebilmesi için kalıtım bağlantısını kurun. İsmi saklayan ve Dog'u metatable olarak ayarlayan bir :new(name) yapıcı metodu ekleyin. Dog sınıfı kendi :speak() metodunu TANIMLAMAMALIDIR; bunu Animal sınıfından miras alacaktır.
  • main.lua: Dog modülünüzü dahil edin, girdiden bir isim okuyun, bu isimle bir Dog örneği oluşturun ve üzerinde :speak() metodunu çağırın.

Bir girdi alacaksınız: köpeğin adı.

Örneğin, girdi Buddy ise, çıktı şu şekilde olmalıdır:

Buddy makes a sound

Buradaki sihir, Dog sınıfınızın hiçbir zaman :speak() metodunu tanımlamamasına rağmen, bir Dog örneği üzerinde bu metodu çağırmanın mükemmel çalışmasıdır. Lua, arama zincirini Dog örneğinden Dog sınıfına, ardından metodu bulduğu Animal sınıfına kadar takip eder. İşte bu, kalıtımın işleyişidir!

Kopya kağıdı

Alt sınıf örnekleri, Lua'nın arama zinciri (lookup chain) aracılığıyla tüm üst sınıf metotlarına otomatik olarak erişim kazanır. Bir örnek üzerinde bir metot çağrıldığında, Lua metodu bulana kadar her bir bağlı tabloyu arar.

Kalıtımı Ayarlama

Üst sınıf tanımı:

local Animal = {}
Animal.__index = Animal

function Animal:new()
    local obj = {}
    setmetatable(obj, Animal)
    return obj
end

function Animal:breathe()
    print("Breathing...")
end

Kalıtım bağlantısı olan alt sınıf:

local Dog = {}
Dog.__index = Dog
setmetatable(Dog, {__index = Animal})

function Dog:new()
    local obj = {}
    setmetatable(obj, Dog)
    return obj
end

Kalıtılan Metotları Kullanma

Alt sınıf örnekleri, alt sınıfta tanımlanmamış olsa bile üst sınıf metotlarını çağırabilir:

local buddy = Dog:new()
buddy:breathe()  -- Çıktı: Breathing...

Arama zinciri: Lua, metot bulunana kadar buddyDogAnimal sırasını kontrol eder.

Çoklu Dosya Sınıf Organizasyonu

Üst sınıf dosyası (Animal.lua):

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

return Animal

Alt sınıf dosyası (Dog.lua):

local Animal = require("Animal")

local Dog = {}
Dog.__index = Dog
setmetatable(Dog, {__index = Animal})

function Dog:new(name)
    local obj = {name = name}
    setmetatable(obj, Dog)
    return obj
end

return Dog

Ana dosya kullanımı:

local Dog = require("Dog")
local buddy = Dog:new("Buddy")
buddy:speak()  -- Çıktı: Buddy makes a sound

Kendin dene

-- main.lua: Giriş noktası

local Dog = require('Dog')

-- Köpeğin adını girdiden oku
local name = io.read()

-- YAPILACAK: Verilen isimle bir Dog örneği oluşturun

-- YAPILACAK: Köpek örneği üzerinde :speak() 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