الوراثة الأحادية مع تسلسل __index
عيّن الفئة الأصلية بوصفها __index لجدول بيانات وصفي لوراثة الأساليب
الوراثة الأحادية مع تسلسل __index درس مجاني في Lua Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Lua Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Lua Academy 4 دروس في المجموع.
سلسلة النموذج الأولي
يعمل التوارث الأحادي بتعيين __index في الصنف الابن إلى الصنف الأب. وعندما لا يُعثر على أسلوب في الابن، تبحث Lua في الأب. وينشئ ذلك سلسلة نموذج أولي.
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)ترتيب حل الأساليب
عند استدعاء أسلوب على نسخة: (1) ابحث في جدول النسخة، (2) ابحث في Child (عبر __index)، (3) ابحث في Base (عبر __index في جدول البيانات الوصفية الخاص بـ Child). يفوز أول تطابق.
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)توارث المُنشئات
يمكن للأصناف الابنة إعادة استخدام مُنشئات الأب باستدعائها، أو تعريف مُنشئاتها الخاصة التي توسّع تهيئة الأب.
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")التحقق من السلالة
اصعد عبر سلسلة جداول البيانات الوصفية للتحقق مما إذا كان صنف كائن ما يرث من أساس معين. هذه هي طريقة عمل instanceof في Lua.
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استدعاء الأب
استدعِ إصدار الأب من أسلوب جرى تجاوزه بالوصول إليه مباشرةً عبر جدول الصنف الأب.
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السلسلة العميقة
أنشئ تسلسلًا هرميًا من ثلاثة مستويات: A → B → C. ويجتاز البحث عن الأساليب السلسلة كاملة حتى يعثر عليها.
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تجاوز الحقول
يمكن للنسخة تجاوز الحقول على مستوى الصنف بتعيينها مباشرةً. ولا يتغير حقل الصنف — بل يُحجب لهذه النسخة فقط.
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التوارث على مستوى الصنف
يؤدي تعيين setmetatable(Child, {__index=Parent}) إلى انتقال عمليات البحث على مستوى الصنف إلى الأب عند عدم العثور عليها. وهذا يعني أن Child.classMethod() يعثر على الأساليب في الصنف الأب إذا لم يجرِ تجاوزها.
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)سلسلة التهيئة
لضمان التهيئة الصحيحة، تستدعي مُنشئات الأبناء مُنشئات الآباء للتأكد من إعداد حالة الأب. نفّذ التهيئة عبر مستويات التسلسل الهرمي.
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)الأصناف الأساسية المجرّدة
أنشئ صنفًا أساسيًا يحتوي على أساليب غير منفذة تطرح أخطاءً. ويجب على الأصناف الفرعية تجاوز هذه الأساليب. ويفرض ذلك عقود الواجهة في نظام الأنواع الديناميكي في Lua.
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"}))سؤال عن التوارث
ما الذي يتيح التوارث الأحادي في Lua؟
مراجعة: التوارث الأحادي
عيّن setmetatable(Child, {__index = Parent}) لتوارث الأساليب. وتوفر سلسلة __index التفويض التلقائي. وللتجاوز، عرّف الأساليب في Child؛ ولاستدعاء الأب، استخدم صراحةً Parent.method(self).
الأسئلة الشائعة
هل درس «الوراثة الأحادية مع تسلسل __index» مجاني؟
نعم — نص درس «الوراثة الأحادية مع تسلسل __index» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Lua Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Lua Academy 4 دروس في المجموع.
ماذا ستتعلم في «الوراثة الأحادية مع تسلسل __index»؟
عيّن الفئة الأصلية بوصفها __index لجدول بيانات وصفي لوراثة الأساليب تتمرن على Lua Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Lua Academy؟
لا تُشترط خبرة سابقة. Lua Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «الوراثة الأحادية مع تسلسل __index»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Lua Academy هذا؟
نعم. كل درس في Lua Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- الوراثة الأحادية مع تسلسل __index
- استدعاء أساليب الفئة الأصلية باستخدام super
- أنماط Mixin
- إعادة التعريف وتعدد الأشكال