Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

استدعاء دوال الفئة الأب

جزء من قسم البرمجة كائنية التوجه في رحلة Lua على Coddy. الدرس 38 من 70.

أحيانًا لا يكون تجاوز method بالكامل هو ما تريده. بدلًا من ذلك، قد ترغب في extends سلوك parent: تنفيذ ما يفعله parent، ثم add شيء إضافي. لتحقيق ذلك، يمكنك call method الخاص بـ parent مباشرةً من داخل التجاوز الخاص بـ child.

تستخدم هذه التقنية صياغة النقطة مع اسم الفئة الأصل، مع تمرير self صراحةً باعتباره الوسيط الأول:

local Animal = {}
Animal.__index = Animal

function Animal:new(name)
    local obj = {name = name}
    setmetatable(obj, Animal)
    return obj
end

function Animal:speak()
    print(self.name .. " makes a sound")
end

-- Dog يمتد سلوك الأصل
local Dog = {}
Dog.__index = Dog
setmetatable(Dog, {__index = Animal})

function Dog:new(name)
    local obj = Animal.new(Animal, name)
    setmetatable(obj, Dog)
    return obj
end

function Dog:speak()
    Animal.speak(self)  -- استدعِ طريقة الأصل أولاً
    print(self.name .. " wags tail happily")
end

السطر الأساسي هو Animal.speak(self). باستخدام صيغة النقطة على الفئة الأصل وتمرير self يدويًا، نستدعي الطريقة الأصلية قبل إضافة سلوكنا الخاص:

local buddy = Dog:new("Buddy")
buddy:speak()
-- الناتج:
-- Buddy يصدر صوتًا
-- Buddy يهز ذيله بسعادة

يكون هذا النمط مفيدًا عندما تنفّذ طريقة parent عملًا مهمًا لا تريد تكراره. يمكن لـchild تشغيل منطق parent أولًا أو أخيرًا أو حتى في منتصف تعليماته البرمجية، مما يمنحك تحكمًا كاملًا في كيفية دمج السلوكيات.

challenge icon

التحدي

سهل

لنبنِ نظام تحية حيث تعمل FormalPerson على توسيع سلوك Person العادية! وبدلاً من استبدال طريقة تقديم الشخص لنفسه بالكامل، ستنفّذ النسخة الرسمية أولاً التقديم المعتاد، ثم تضيف لمسة مهذبة إضافية.

ستنظّم الشيفرة عبر ثلاثة ملفات:

  • Person.lua: فئة Base الخاصة بك، مع مُنشئ :new(name) يخزّن اسم الشخص. أضف أسلوب :introduce() يطبع اسم الشخص متبوعاً بـ says hi. هذا هو السلوك الأساسي الذي سيتم توسيعه.
  • FormalPerson.lua: فئة child ترث من Person. يجب أن يستدعي مُنشئها مُنشئ parent لمعالجة الاسم. أعد تعريف أسلوب :introduce()، لكن بدلاً من استبدال سلوك parent بالكامل، استدعِ أسلوب parent أولاً باستخدام Person.introduce(self)، ثم اطبع سطراً إضافياً يتضمن اسم الشخص متبوعاً بـ bows politely.
  • main.lua: اطلب وحدة FormalPerson، واقرأ اسماً من input، وأنشئ instance من FormalPerson، واستدعِ :introduce() لرؤية السلوكين مدمجين.

ستتلقى input واحداً: اسم الشخص.

عند استدعاء :introduce() على FormalPerson، يجب أن ينتج سطرين من Output: الأول من أسلوب parent، والثاني من إضافة child:

{name} says hi
{name} bows politely

على سبيل المثال، إذا كان input هو Eleanor، فيجب أن يكون Output:

Eleanor says hi
Eleanor bows politely

الفكرة الأساسية هنا هي أن FormalPerson لا تكرر منطق "says hi". بل تفوّض هذه المهمة إلى أسلوب parent، ثم تضيف سلوكها الفريد فوقه. وهذا يحافظ على نظافة شيفرتك ويوضح كيف يمكن لفئات child أن توسّع وظائف parent بدلاً من استبدالها!

جرّب بنفسك

-- main.lua: نقطة الدخول لنظام التحية

local FormalPerson = require('FormalPerson')

-- اقرأ اسم الشخص من الإدخال
local name = io.read()

-- TODO: أنشئ مثيلاً من FormalPerson بالاسم المعطى

-- TODO: استدعِ الطريقة introduce على مثيل FormalPerson
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم Lua عبر الإنترنت