__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()) -- 7Derin 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 AAlanları 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 10Sı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
- __index Zincirleme ile Tekli Kalıtım
- Üst Sınıf Yöntemlerini super ile Çağırma
- Karışım Örüntüleri
- Geçersiz Kılma ve Çok Biçimlilik