Üst Sınıf Yöntemlerini super ile Çağırma
Birlikte çalışan başlatma için temel sınıf yöntemlerini açıkça çağırın.
Üst Sınıf Yöntemlerini super ile Çağırma, CoddyKit'te ücretsiz bir Lua Academy dersidir. Bu, 4 dersinin 2. 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.
Neden Üst Sınıf Çağrıları?
Bir alt sınıf, üst sınıftaki bir yöntemi geçersiz kıldığı hâlde üst sınıfın mantığına ihtiyaç duyduğunda üst sınıf yöntemini açıkça çağırır. Lua'da super anahtar sözcüğü yoktur — üst sınıf tablosuna doğrudan başvurun: Parent.method(self, args).
local Base={}
Base.__index=Base
function Base:describe()
return "Base[name="..self.name.."]"
end
local Child={}
Child.__index=Child
setmetatable(Child,{__index=Base})
function Child:describe()
local parentDesc = Base.describe(self) -- super call
return parentDesc .. " + Child[extra=true]"
end
local c=setmetatable({name="X"},Child)
print(c:describe())Yapıcıda Üst Sınıf Çağrısı
Alt sınıf yapıcıları, Parent.new() veya Parent._init(self,...) aracılığıyla üst sınıf yapıcılarını çağırır. Bu, her alt sınıf örneği için üst sınıfın başlatma işleminin çalışmasını sağlar.
local Animal={}
Animal.__index=Animal
function Animal._init(self,name,sound)
self.name=name; self.sound=sound; self.alive=true
end
local Dog={}
Dog.__index=Dog; setmetatable(Dog,{__index=Animal})
function Dog.new(name,breed)
local self=setmetatable({},Dog)
Animal._init(self,name,"Woof") -- super init
self.breed=breed
return self
end
local d=Dog.new("Rex","Lab")
print(d.name,d.sound,d.breed)İş Birlikçi Başlatma
Derin hiyerarşilerde her düzey yalnızca kendi alanlarını başlatır ve üst sınıfın init işlevini çağırır. Bu, her sınıfın yalnızca kendi alanlarından sorumlu kalmasını sağlar.
local A={}
function A._init(self,x) self.x=x end
local B={}
function B._init(self,x,y) A._init(self,x); self.y=y end
local C={}
C.__index=C
function C.new(x,y,z)
local self=setmetatable({},C)
B._init(self,x,y)
self.z=z
return self
end
local c=C.new(1,2,3)
print(c.x,c.y,c.z) -- 1 2 3super Sarmalayıcısı
self değerini kullanarak üst sınıf yöntemlerini çağıran bir vekil nesne döndüren super(self) yardımcısı oluşturun. Bu, Parent.method(self, ...) söz diziminden daha temizdir.
local function super(self)
local mt = getmetatable(getmetatable(self).__index)
if mt then
return setmetatable({}, {__index=function(_,k)
local parentCls = mt.__index or mt
return function(...) return parentCls[k](self,...) end
end})
end
end
print("super() helper pattern shown")Birden Çok Düzey
Birden çok kalıtım düzeyi olduğunda her düzey kendi doğrudan üst sınıfını çağırır. Zincir otomatik olarak ilerler.
local L1={} L1.__index=L1
function L1:intro() return "L1" end
local L2={} L2.__index=L2
setmetatable(L2,{__index=L1})
function L2:intro() return L1.intro(self).."+L2" end
local L3={} L3.__index=L3
setmetatable(L3,{__index=L2})
function L3:intro() return L2.intro(self).."+L3" end
local obj=setmetatable({},L3)
print(obj:intro()) -- L1+L2+L3Yöntem Genişletme
Bir üst sınıf yöntemini genişletin: üst sınıf sürümünü çağırın, ardından ek davranış ekleyin. Bu, biçimsel bir AOP çatısı olmadan "önce" veya "sonra" danışmanlığıdır.
local Logger={} Logger.__index=Logger
function Logger:log(msg) print("[LOG] "..msg) end
local TimedLogger={} TimedLogger.__index=TimedLogger
setmetatable(TimedLogger,{__index=Logger})
function TimedLogger:log(msg)
local ts=os.date("%H:%M:%S")
Logger.log(self,"["..ts.."] "..msg) -- augment
end
local tl=setmetatable({},TimedLogger)
tl:log("Server started")Üst Sınıf Çağrısı Tuzaklarından Kaçınma
Üst sınıf çağrılarında getmetatable(self).__index yerine her zaman tam üst sınıf adını kullanın — üst veri tablosu araması gerçek üst sınıf yerine aradaki bir sınıfı döndürebilir. Açıklık ve doğruluk için açık olun.
-- Correct: explicit parent reference
function Child:init(x)
Base.init(self, x) -- explicit, clear
end
-- Fragile: uses metatable lookup
function Child:initBad(x)
local parent = getmetatable(getmetatable(self).__index)
-- This may not be Base if hierarchy changes!
end
print("Be explicit with parent class references")__tostring için Üst Sınıf Çağrısı
Tam bir açıklama elde etmek için üst sınıfın gösterimini de dahil ederken alt sınıfta __tostring değerini geçersiz kılın.
local Base={}
Base.__index=Base
Base.__tostring=function(self) return "Base("..self.name..")" end
local Child={}
Child.__index=Child
setmetatable(Child,{__index=Base})
Child.__tostring=function(self)
local baseStr = Base.__tostring(self)
return baseStr.." + Child(level="..self.level..")"
end
local c=setmetatable({name="X",level=5},Child)
print(tostring(c)) -- Base(X) + Child(level=5)Korumalı Şablon Yöntemi
Şablon yöntemi kalıbında temel sınıf, soyut adımlara yapılan çağrıları içeren bir algoritma iskeleti tanımlar; alt sınıflar bu adımları uygular.
local Processor={} Processor.__index=Processor
function Processor:run(data)
data = self:preProcess(data)
data = self:process(data)
return self:postProcess(data)
end
function Processor:preProcess(d) return d end
function Processor:postProcess(d) return d end
function Processor:process(d) error("implement process()") end
local Upper={} Upper.__index=Upper
setmetatable(Upper,{__index=Processor})
function Upper:process(d) return d:upper() end
local p=setmetatable({},Upper)
print(p:run("hello")) -- HELLOÜst Sınıf Çağrısı Geleneği
Gelenek: yalnızca dahili kullanılan başlatma işlevlerinin önüne _ ekleyin (ör. _init) ve genel new() işlevini yalnızca en üst düzey yapıcıda dışa açın. Bu, kalıtım zincirini temiz tutar.
-- Convention summary:
-- Animal._init(self, ...) -- used for super calls
-- Dog.new(...) -- only public constructor
-- Never call Dog._init from outside
local Foo={} Foo.__index=Foo
function Foo._init(self,x) self.x=x end
function Foo.new(x)
return setmetatable({},Foo):_init(x) or
(function() local s=setmetatable({},Foo); Foo._init(s,x); return s end)()
end
print("Convention: _init for super, new() for public")Üst Sınıf Çağrısı Sorusu
Lua'da bir üst sınıf yöntemini nasıl çağırırsınız?
Özet: Üst Sınıf Çağrıları
Üst sınıf yöntemlerini her zaman açık sınıf başvurusu kullanarak çağırın: Parent.method(self, ...). Kalıtım düzeyleri boyunca iş birlikçi yapıcılar için _init geleneğini kullanın.
Sıkça Sorulan Sorular
“Üst Sınıf Yöntemlerini super ile Çağırma” dersi ücretsiz mi?
Evet — “Üst Sınıf Yöntemlerini super ile Çağırma” 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.
“Üst Sınıf Yöntemlerini super ile Çağırma” dersinde ne öğreneceğim?
Birlikte çalışan başlatma için temel sınıf yöntemlerini açıkça çağırı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 2. dersidir.
“Üst Sınıf Yöntemlerini super ile Çağırma” 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