0Pricing
Lua Academy · Ders

__index Zincirleme ile Tekli Kalıtım

Yöntemleri devralmak için bir üst sınıfı üst tablonun __index'i olarak ayarlayın.

__index Zincirleme ile Tekli Kalıtım, CoddyKit'te ücretsiz bir Lua Academy dersidir. Bu, 4 dersinin 1. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Lua Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Lua Academy kursu toplamda 4 dersten oluşur.

Prototip Zinciri

Tekli kalıtım, bir alt sınıfın __index değerinin üst sınıfa ayarlanmasıyla çalışır. Bir yöntem alt sınıfta bulunamadığında Lua üst sınıfa bakar. Böylece bir prototip zinciri oluşur.

local Base={}
Base.__index=Base
function Base.new() return setmetatable({},Base) end
function Base:greet() print("Hello from Base") end

local Child={}
Child.__index=Child
setmetatable(Child,{__index=Base})  -- Child inherits Base

function Child.new() return setmetatable({},Child) end

local c=Child.new()
c:greet()  -- Hello from Base (inherited)

Yöntem Çözümleme Sırası

Bir örnekte yöntem çağrılırken: (1) örnek tablosuna bakılır, (2) Child içinde aranır (__index aracılığıyla), (3) Base içinde aranır (Child'ın üst veri tablosundaki __index aracılığıyla). İlk eşleşme kazanır.

local Base={}
Base.__index=Base
function Base:who() print("I am Base") end

local Child={}
Child.__index=Child
setmetatable(Child,{__index=Base})
function Child:who() print("I am Child") end  -- override

local b=setmetatable({},Base)
local c=setmetatable({},Child)
b:who()  -- I am Base
c:who()  -- I am Child (overrides)

Yapıcıları Miras Alma

Alt sınıflar, üst sınıf yapıcılarını çağırarak yeniden kullanabilir veya üst sınıfın başlatma işlemini genişleten kendi yapıcılarını tanımlayabilir.

local Animal={}
Animal.__index=Animal
function Animal.new(name,sound)
  return setmetatable({name=name,sound=sound},Animal)
end
function Animal:speak() print(self.name..": "..self.sound) end

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

function Dog.new(name)
  local self = Animal.new(name,"Woof")
  return setmetatable(self,Dog)
end
function Dog:fetch(item) print(self.name.." fetches "..item) end

local d=Dog.new("Rex")
d:speak(); d:fetch("ball")

Soy Geçmişini Denetleme

Bir nesnenin sınıfının belirli bir temel sınıftan miras alıp almadığını denetlemek için üst veri tablosu zincirinde yukarı doğru ilerleyin. Lua'da instanceof böyle çalışır.

local function instanceof(obj, cls)
  local mt = getmetatable(obj)
  while mt do
    if mt == cls then return true end
    mt = getmetatable(mt)
  end
  return false
end

Üst Sınıf Çağrısı

Geçersiz kılınmış bir yöntemin üst sınıftaki sürümünü, üst sınıf tablosu üzerinden doğrudan erişerek çağırın.

local Base={}
Base.__index=Base
function Base:init(x) self.x=x end
function Base:value() return self.x end

local Child={}
Child.__index=Child
setmetatable(Child,{__index=Base})
function Child:init(x,y)
  Base.init(self,x)  -- call parent
  self.y=y
end
function Child:value() return Base.value(self)+self.y end

local c=setmetatable({},Child)
c:init(3,4)
print(c:value())  -- 7

Derin Zincir

Üç düzeyli bir hiyerarşi oluşturun: A → B → C. Yöntem araması, yöntem bulunana kadar zincirin tamamında ilerler.

local A={}
A.__index=A
function A:aMethod() print("A method") end

local B={}
B.__index=B
setmetatable(B,{__index=A})
function B:bMethod() print("B method") end

local C={}
C.__index=C
setmetatable(C,{__index=B})

local c=setmetatable({},C)
c:bMethod()  -- from B
c:aMethod()  -- from A

Alanları Geçersiz Kılma

Bir örnek, alanları doğrudan ayarlayarak sınıf düzeyindeki alanları geçersiz kılabilir. Sınıf alanı değiştirilmez — yalnızca o örnek için gizlenir.

local Creature={}
Creature.__index=Creature
Creature.hp=100
Creature.speed=10

function Creature.new()
  return setmetatable({},Creature)
end

local fast=Creature.new()
fast.speed=20  -- override for this instance

local normal=Creature.new()

print(fast.speed,normal.speed,Creature.speed)  -- 20  10  10

Sınıf Düzeyinde Kalıtım

setmetatable(Child, {__index=Parent}) ayarı, sınıf düzeyindeki aramaların üst sınıfa kadar ilerlemesini sağlar. Bu, Child.classMethod() çağrısının geçersiz kılınmadıysa üst sınıftaki yöntemleri bulması anlamına gelir.

local Vehicle={}
Vehicle.__index=Vehicle
Vehicle.maxSpeed=120
function Vehicle.describe() print("Vehicle") end

local Car={}
Car.__index=Car
setmetatable(Car,{__index=Vehicle})

Car.describe()  -- Vehicle (inherited class method)
print(Car.maxSpeed)  -- 120 (inherited class field)

Başlatma Zinciri

Doğru başlatma için alt sınıf yapıcıları, üst sınıf durumunun kurulmasını sağlamak üzere üst sınıf yapıcılarını çağırır. Başlatmayı hiyerarşide yukarı doğru zincirleyin.

local Base={}
Base.__index=Base
function Base:_init(name) self.name=name end

local Mid={}
Mid.__index=Mid
setmetatable(Mid,{__index=Base})
function Mid:_init(name,level)
  Base._init(self,name)
  self.level=level
end

local Top={}
Top.__index=Top
setmetatable(Top,{__index=Mid})
function Top.new(name,level,role)
  local self=setmetatable({},Top)
  Mid._init(self,name,level)
  self.role=role
  return self
end

local t=Top.new("Alice",5,"admin")
print(t.name,t.level,t.role)

Soyut Temel Sınıflar

Hata veren, uygulanmamış yöntemlere sahip bir temel sınıf oluşturun. Alt sınıflar bu yöntemleri geçersiz kılmalıdır. Bu, Lua'nın dinamik tür sisteminde arayüz sözleşmelerini zorunlu kılar.

local Serializer={}
Serializer.__index=Serializer
function Serializer:encode(data)
  error(self._type.." must implement encode()",2)
end
function Serializer:decode(str)
  error(self._type.." must implement decode()",2)
end

local JSONSerializer={_type="JSON"}
setmetatable(JSONSerializer,{__index=Serializer})
function JSONSerializer:encode(data)
  return "{"..tostring(data.key).."}"
end

local j=setmetatable({_type="JSON"},JSONSerializer)
print(j:encode({key="val"}))

Kalıtım Sorusu

Lua'da tekli kalıtımı ne mümkün kılar?

Özet: Tekli Kalıtım

Yöntemleri miras almak için setmetatable(Child, {__index = Parent}) ayarlayın. __index zinciri otomatik yetkilendirme sağlar. Child içinde yöntemler tanımlayarak geçersiz kılın; üst sınıfı açıkça Parent.method(self) ile çağırın.

Sıkça Sorulan Sorular

“__index Zincirleme ile Tekli Kalıtım” dersi ücretsiz mi?

Evet — “__index Zincirleme ile Tekli Kalıtım” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Lua Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Lua Academy kursu toplamda 4 dersten oluşur.

“__index Zincirleme ile Tekli Kalıtım” dersinde ne öğreneceğim?

Yöntemleri devralmak için bir üst sınıfı üst tablonun __index'i olarak ayarlayın. Lua Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Lua Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Lua Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 1. dersidir.

“__index Zincirleme ile Tekli Kalıtım” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Lua Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Lua Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. __index Zincirleme ile Tekli Kalıtım
  2. Üst Sınıf Yöntemlerini super ile Çağırma
  3. Karışım Örüntüleri
  4. Geçersiz Kılma ve Çok Biçimlilik
← Lua Academy Sayfasına Dön