0Pricing
Lua Academy · درس

الوراثة متعددة المستويات

ادعم سلاسل الوراثة العميقة مع التفويض السليم لـ __index

الوراثة متعددة المستويات درس مجاني في Lua Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Lua Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Lua Academy 4 دروس في المجموع.

مراجعة التوريث الأحادي

يتحقق التوريث الأحادي بضبط Child.__index = Parent. ويكون البحث عن الطريقة كالتالي: إذا لم توجد في Child، فابحث عنها في Parent عبر __index.

توسيع مصنع الأصناف للتوريث

أضف طريقة :extend() إلى الصنف الأساسي، بحيث تنشئ صنفًا فرعيًا مرتبطًا بالصنف الأب.

function Animal:extend()
  local cls = {}
  cls.__index = cls
  setmetatable(cls, {__index = self})
  cls.super = self
  function cls:new(...)
    local inst = setmetatable({}, cls)
    if inst.init then inst:init(...) end
    return inst
  end
  return cls
end

إنشاء صنف فرعي

أنشئ Dog صنفًا فرعيًا من Animal، مع تجاوز init وإضافة طرق جديدة.

local Dog = Animal:extend()
function Dog:init(name)
  Dog.super.init(self, name, "Woof")
  self.tricks = {}
end
function Dog:learnTrick(trick)
  self.tricks[#self.tricks+1] = trick
end
local d = Dog:new("Rex")
d:learnTrick("sit")
d:speak()  -- Rex says Woof

سلسلة متعددة المستويات

وسّع Dog لإنشاء GuideDog — وهي سلسلة توريث من ثلاثة مستويات.

local GuideDog = Dog:extend()
function GuideDog:init(name, owner)
  GuideDog.super.init(self, name)
  self.owner = owner
end
function GuideDog:guide()
  print(self.name .. " guides " .. self.owner)
end

استدعاء طرق super

استدعِ super دائمًا عبر مرجع الصنف، وليس عبر self، لتجنب الاستدعاء التكراري اللانهائي.

function Dog:init(name)
  Dog.super.init(self, name, "Woof")  -- explicit super call
end

ترتيب حل الطرق

تحل Lua الطرق من الأسفل إلى الأعلى عبر سلاسل __index. GuideDog ← Dog ← Animal ← nil. وتكون الأولوية لأول طريقة يتم العثور عليها.

تجاوز الطرق

عرّف طريقة بالاسم نفسه في الصنف الفرعي لتجاوز الطريقة الأصلية. واستدعِ super صراحةً عند الحاجة إلى تجاوز جزئي.

function Dog:speak()
  print(self.name .. " barks!")
  Dog.super.speak(self)  -- also call parent speak
end

حدود العمق

تؤدي سلاسل التوريث العميقة جدًا إلى إبطاء البحث عن الطرق، إذ يضيف كل مستوى خطوة __index واحدة. فضّل التركيب عند تجاوز 3 أو 4 مستويات.

التحقق من انتماء النسخة إلى صنف

تتبّع سلسلة metatable للتحقق مما إذا كانت النسخة تنتمي إلى صنف معين.

local function isA(instance, cls)
  local mt = getmetatable(instance)
  while mt do
    if mt == cls then return true end
    mt = getmetatable(mt)
  end
  return false
end
print(isA(d, Dog))     -- true
print(isA(d, Animal))  -- true

النسخ العميق مع الحفاظ على الصنف

عند نسخ النسخ نسخًا عميقًا، حافظ على metatable لكي تظل النسخة المنسوخة نسخةً من الصنف الصحيح.

متى يُفضَّل التركيب

استخدم التوريث لعلاقات «هو» الحقيقية (Dog هو Animal). واستخدم التركيب (جداول المكونات) لعلاقات «يمتلك» أو لخلط السلوكيات بمرونة.

سؤال حول التوريث

كيف يعمل التوريث متعدد المستويات في Lua؟

مراجعة: التوريث متعدد المستويات

وسّع مصنع الأصناف باستخدام طريقة :extend() التي تصل روابط __index في سلسلة. واستدعِ super صراحةً باستخدام ClassName.super.method(self, ...). وتحقق من الانتماء عبر تتبع سلسلة metatable.

الأسئلة الشائعة

هل درس «الوراثة متعددة المستويات» مجاني؟

نعم — نص درس «الوراثة متعددة المستويات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Lua Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Lua Academy 4 دروس في المجموع.

ماذا ستتعلم في «الوراثة متعددة المستويات»؟

ادعم سلاسل الوراثة العميقة مع التفويض السليم لـ __index تتمرن على Lua Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Lua Academy؟

لا تُشترط خبرة سابقة. Lua Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «الوراثة متعددة المستويات»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Lua Academy هذا؟

نعم. كل درس في Lua Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

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

  1. تصميم الفئة الأساسية والمنشئ
  2. الوراثة متعددة المستويات
  3. تركيب Mixin والتحقق من الواجهات
  4. ‏instanceof واستبطان النوع
← العودة إلى Lua Academy