استدعاء أساليب الفئة الأصلية باستخدام super
استدعِ أساليب الفئة الأساسية صراحةً لتهيئة تعاونية
استدعاء أساليب الفئة الأصلية باستخدام super درس مجاني في Lua Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Lua Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Lua Academy 4 دروس في المجموع.
لماذا استدعاءات الأب؟
عندما يتجاوز الابن أسلوبًا في الأب لكنه يظل بحاجة إلى منطق الأب، فإنه يستدعي أسلوب الأب صراحةً. لا تحتوي Lua على الكلمة المفتاحية super — بل تشير مباشرةً إلى جدول الأب: 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())الأب في المُنشئ
تستدعي مُنشئات الأبناء مُنشئات الآباء عبر Parent.new() أو Parent._init(self,...). ويضمن ذلك تشغيل تهيئة الأب لكل نسخة من الأبناء.
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)التهيئة التعاونية
في التسلسلات الهرمية العميقة، يهيّئ كل مستوى حقوله الخاصة فقط ويستدعي تهيئة الأب. ويحافظ ذلك على مسؤولية كل صنف عن حقوله وحدها.
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 3غلاف super
أنشئ مساعدًا باسم super(self) يعيد كائنًا وكيلًا يستدعي أساليب الأب مع self. ويوفر ذلك صيغة أوضح من Parent.method(self, ...).
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")مستويات متعددة
عند وجود مستويات توارث متعددة، يستدعي كل مستوى أباه المباشر. وتنتقل السلسلة تلقائيًا.
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+L3إضافة سلوك إلى الأساليب
أضف سلوكًا إلى أسلوب في الأب: استدعِ إصدار الأب أولًا، ثم أضف السلوك الإضافي. وهذا يشبه المشورة "قبل" أو "بعد" دون إطار رسمي للبرمجة الموجهة بالجانب.
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")تجنب مشكلات استدعاء الأب
استخدم دائمًا الاسم الدقيق لصنف الأب، وليس getmetatable(self).__index، عند استدعاءات الأب — فقد يعيد البحث في جدول البيانات الوصفية صنفًا وسيطًا، لا الأب الحقيقي. كن صريحًا لضمان الوضوح والصحة.
-- 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
تجاوز __tostring في الابن مع تضمين تمثيل الأب للحصول على وصف كامل.
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)أسلوب القالب المحمي
نمط أسلوب القالب: يعرّف الصنف الأساسي هيكلًا لخوارزمية يتضمن استدعاءات لخطوات مجرّدة؛ وتنفذ الأصناف الفرعية هذه الخطوات.
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عرف استدعاء الأب
العرف: أضف البادئة _ إلى دوال التهيئة الداخلية فقط (مثل _init)، ووفّر new() عامًا في المُنشئ ذي المستوى الأعلى فقط. ويحافظ ذلك على نظافة سلسلة التوارث.
-- 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")سؤال عن استدعاء الأب
كيف تستدعي أسلوبًا في الأب في Lua؟
مراجعة: استدعاءات الأب
استدعِ أساليب الأب دائمًا عبر مرجع صريح إلى الصنف: Parent.method(self, ...). واستخدم العرف _init للمُنشئات التعاونية عبر مستويات التوارث.
الأسئلة الشائعة
هل درس «استدعاء أساليب الفئة الأصلية باستخدام super» مجاني؟
نعم — نص درس «استدعاء أساليب الفئة الأصلية باستخدام super» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Lua Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Lua Academy 4 دروس في المجموع.
ماذا ستتعلم في «استدعاء أساليب الفئة الأصلية باستخدام super»؟
استدعِ أساليب الفئة الأساسية صراحةً لتهيئة تعاونية تتمرن على Lua Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Lua Academy؟
لا تُشترط خبرة سابقة. Lua Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «استدعاء أساليب الفئة الأصلية باستخدام super»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Lua Academy هذا؟
نعم. كل درس في Lua Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- الوراثة الأحادية مع تسلسل __index
- استدعاء أساليب الفئة الأصلية باستخدام super
- أنماط Mixin
- إعادة التعريف وتعدد الأشكال