0Pricing
Lua Academy · درس

الوراثة الأحادية مع تسلسل __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 يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. الوراثة الأحادية مع تسلسل __index
  2. استدعاء أساليب الفئة الأصلية باستخدام super
  3. أنماط Mixin
  4. إعادة التعريف وتعدد الأشكال
← العودة إلى Lua Academy