Menu
Coddy logo textTech

Kalıtım Kurulumu

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

Şimdiye kadar, her nesnenin yöntemleri tek bir prototip tablosunda aradığı sınıflar oluşturdunuz. Peki ya bir sınıfın diğeri üzerine inşa edilmesini isterseniz? İşte burada kalıtım (inheritance) devreye girer; bir alt sınıf, kendi özelliklerini eklerken bir üst sınıftaki her şeye erişebilir.

Temel içgörü, bir sınıf tablosunun kendisinin de bir metatabloya sahip olabilmesidir. Lua, alt sınıfta (child class) bir şey bulamadığında, alt sınıfın metatablosundaki __index alanına bakar; bu alan da üst sınıfı (parent class) işaret eder.

-- Üst sınıf
local Animal = {}
Animal.__index = Animal

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

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

İşte kalıtım kurulumu. Bir alt sınıf oluşturuyoruz ve metatablosunu üst sınıfa bakacak şekilde ayarlıyoruz:

-- Alt sınıf
local Dog = {}
Dog.__index = Dog
setmetatable(Dog, {__index = Animal})

Bu tek satır—setmetatable(Dog, {__index = Animal})—kalıtım bağlantısını oluşturur. Bir Dog örneği, Dog içinde bulunmayan bir metodu çağırdığında, Lua Animal'ı kontrol eder.

Arama zinciri şu şekilde çalışır: örnek → Dog → Animal. Her adım, aranacak bir sonraki tabloyu bulmak için __index kullanır. Bu, alt sınıfların tüm üst sınıf metotlarını kopyalamadan otomatik olarak devralmasını sağlar.

challenge icon

Görev

Kolay

İlk kalıtım hiyerarşinizi oluşturalım! Bir Machine sınıfının temel görevi gördüğü ve bir Robot sınıfının ondan miras aldığı basit bir ebeveyn-çocuk sınıf ilişkisi oluşturacaksınız.

Kodunuzu üç dosya halinde düzenleyeceksiniz:

  • Machine.lua: Standart sınıf modelini kullanarak ebeveyn sınıfınızı tanımlayın. Bir :new() yapıcı metodu (constructor) ve Machine is operational yazdıran bir :status() metodu ekleyin. __index yapısını kurmayı ve dosyanın sonunda sınıfı döndürmeyi unutmayın.
  • Robot.lua: Machine sınıfından miras alan çocuk sınıfınızı tanımlayın. Machine modülünü require ile dahil edin, Robot tablosunu kendi __index yapısıyla kurun ve setmetatable(Robot, {__index = Machine}) kullanarak kalıtım bağlantısını oluşturun. Robot'u metatablosu olarak kullanan bir örnek (instance) oluşturan bir :new() yapıcı metodu ekleyin.
  • main.lua: Robot modülünüzü require ile dahil ederek, bir Robot örneği oluşturarak ve miras alınan :status() metodunu çağırarak her şeyi bir araya getirin.

Buradaki temel kavram, Robot sınıfınızın :status() metodunu kendisinin tanımlamamasıdır; bu metodu metatablo zinciri aracılığıyla Machine sınıfından miras alır. Bir Robot örneği üzerinde :status() metodunu çağırdığınızda, Lua önce Robot içinde arayacak, bulamayacak ve ardından __index bağlantısını takip ederek metodu keşfedeceği Machine sınıfına gidecektir.

Çıktınız şu şekilde olmalıdır:

Machine is operational

Bu tek satır, kalıtımın çalıştığını kanıtlar; Robot'unuz, yalnızca ebeveyn sınıfında tanımlanmış bir metoda başarıyla erişti!

Kopya kağıdı

Lua'da kalıtım oluşturmak için, bir sınıf tablosunun metatablosunu __index kullanarak üst sınıfı işaret edecek şekilde ayarlayın:

-- Üst sınıf
local Animal = {}
Animal.__index = Animal

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

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

-- Alt sınıf
local Dog = {}
Dog.__index = Dog
setmetatable(Dog, {__index = Animal})

Kalıtım bağlantısı setmetatable(Dog, {__index = Animal}) ile oluşturulur. Bu, Dog örneklerinin Animal metotlarına otomatik olarak erişmesini sağlar.

Arama zinciri şu sırayı takip eder: örnek → Alt sınıf → Üst sınıf. Her adım, aranacak bir sonraki tabloyu bulmak için __index kullanır.

Kendin dene

-- main.lua: Her şeyi bir araya getirin

-- YAPILACAK: Robot modülünü dahil edin (require)

-- YAPILACAK: Robot:new() kullanarak bir Robot örneği oluşturun

-- YAPILACAK: Robot örneğinizde kalıtılan :status() metodunu çağırın
-- Bu, "Machine is operational" yazdırmalıdır
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