Menu
Coddy logo textTech

Kalıtım Kurulumu

Coddy'nin Lua Journey'sinin Nesne Yönelimli Programlama 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şturdun. Peki bir sınıfın başka bir sınıf üzerine kurulmasını istersen ne olacak? İşte burada kalıtım devreye girer: bir alt sınıf, kendi özelliklerini eklerken ü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 bir şey bulamadığında, alt sınıfın metatablosundaki ve üst sınıfı gösteren __index alanına bakar.

-- Ü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

Şimdi kalıtım kurulumu şöyle. Bir alt sınıf oluşturuyor ve metatablosunu üst sınıfa bakacak şekilde ayarlıyoruz:

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

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

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

challenge icon

Görev

Kolay

İlk kalıtım hiyerarşinizi oluşturalım! Taban olarak Machine sınıfının görev yaptığı ve Robot sınıfının bundan kalıtım aldığı basit bir üst sınıf-alt sınıf ilişkisi oluşturacaksınız.

Kodunuzu üç dosyaya ayıracaksınız:

  • Machine.lua: Standart sınıf kalıbını kullanarak üst sınıfınızı tanımlayın. :new() oluşturucusunu ve :status() yazdıran bir Machine is operational metodunu ekleyin. __index değerini ayarlamayı ve dosyanın sonunda sınıfı döndürmeyi unutmayın.
  • Robot.lua: Machine'den kalıtım alan alt sınıfınızı tanımlayın. Machine modülünü içe aktarın, kendi __index değerine sahip Robot tablosunu oluşturun ve setmetatable(Robot, {__index = Machine}) kullanarak kalıtım bağlantısını kurun. Robot'u metatablo olarak kullanan bir örnek oluşturan :new() oluşturucusunu ekleyin.
  • main.lua: Robot modülünüzü içe aktararak, bir Robot örneği oluşturarak ve kalıtılan :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'den alır. Bir Robot örneği üzerinde :status() çağırdığınızda Lua önce Robot'ta arama yapar, metodu bulamaz ve ardından __index bağlantısını izleyerek metodu bulduğu Machine'e ulaşır.

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

Machine is operational

Bu tek satır, kalıtımın çalıştığını kanıtlar. Robot, yalnızca üst sınıfında tanımlanan bir metoda başarıyla erişti!

Kendin dene

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

-- TODO: Robot modülünü require et

-- TODO: Robot:new() kullanarak bir Robot örneği oluştur

-- TODO: Robot örneğinizde miras alınan :status() metodunu çağır
-- This should print "Machine is operational"
quiz iconKendini test et

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

Kendi başına pratik yap: Online Lua derleyicisi