Menu
Coddy logo textTech

Metot Kalıtımı

Coddy'nin Lua Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 32 / 70.

Miras bağlantısı kurulduğunda, alt sınıf örnekleri otomatik olarak tüm üst sınıf yöntemlerine erişim kazanır. Bu, Lua’nın arama zinciri aracılığıyla gerçekleşir; bir örnek üzerinde yöntem çağırdığınızda Lua, aradığınızı bulana kadar bağlantılı tabloların her birinde arama yapar.

Animal sınıfının :breathe() yöntemini tanımladığı bu kurulumu düşünün:

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şturup üst sınıfın yöntemini çağırdığımızda ne olduğuna bakın:

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

Dog sınıfı :breathe() yöntemini hiç tanımlamadı, yine de çalışıyor. Lua önce buddy içinde kontrol eder ve hiçbir şey bulamaz, ardından Dog içinde kontrol eder ve yine hiçbir şey bulamaz; sonunda onu Animal içinde bulur. Bu otomatik yöntem kalıtımı, ortak davranışı üst sınıfta bir kez yazmanızı ve her alt sınıfın bundan hemen yararlanmasını sağlar.

challenge icon

Görev

Kolay

Yöntem kalıtımını uygulamalı olarak görmek için basit bir yaratık 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ımlanan yöntemleri kullanabildiğini göstereceksin.

Kodunu üç dosyaya ayıracaksın:

  • Animal.lua: Standart sınıf kalıbını kullanarak üst sınıfını tanımla. Hayvanın adını saklayan bir :new(name) oluşturucusu ve hayvanın adının ardından :speak() yazdıran bir makes a sound yöntemi ekle. Dosyanın sonunda sınıfı döndür.
  • Dog.lua: Animal'dan kalıtım alan alt sınıfını tanımla. Animal modülünü gerektir ve Dog'un Animal yöntemlerine erişebilmesi için kalıtım bağlantısını kur. Adı saklayan ve Dog'u metatablo olarak ayarlayan bir :new(name) oluşturucusu ekle. Dog sınıfı kendi :speak() yöntemini TANIMLAMAMALIDIR. Bu yöntemi Animal'dan kalıtacaktır.
  • main.lua: Dog modülünü gerektir, girdiden bir ad oku, bu adla bir Dog örneği oluştur ve üzerinde :speak() yöntemini çağır.

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

Örneğin girdi Buddy ise çıktı şöyle olmalıdır:

Buddy makes a sound

Buradaki sihir, Dog sınıfının hiçbir zaman :speak() tanımlamamasına rağmen bir Dog örneği üzerinde çağrıldığında bunun kusursuz şekilde çalışmasıdır. Lua, arama zincirini Dog örneğinden Dog sınıfına, ardından yöntemi bulduğu Animal sınıfına kadar izler. İşte kalıtım böyle çalışır!

Kendin dene

-- main.lua: Giriş noktası

local Dog = require('Dog')

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

-- TODO: Verilen adla bir Dog örneği oluştur

-- TODO: Köpek örneğinde :speak() metodunu çağır
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