استدعاء دوال الفئة الأب
جزء من قسم البرمجة كائنية التوجه في رحلة 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 أولًا أو أخيرًا أو حتى في منتصف تعليماته البرمجية، مما يمنحك تحكمًا كاملًا في كيفية دمج السلوكيات.
التحدي
سهللنبنِ نظام تحية حيث تعمل 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
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
4مشروع: بنك رقمي
إعداد المشروعطريقة الإيداع7تعدد الأشكال وإعادة التعريف
إعادة تعريف الدوالاستدعاء دوال الفئة الأبDuck Typingواجهة مشتركةالتحقق من النوعمراجعة - أدوار الموظفين2نمط النموذج الأولي للفئات
مفهوم النموذج الأوليالربط باستخدام __indexالمنشئ :new()تهيئة الخصائصنسخ مستقلةملخص - مصنع السيارات5تحميل المعاملات في OOP
جمع الكائناتطرح الكائناتدمج الكائناتمقارنة الكائنات (<, >)مراجعة - رياضيات المحفظة8التغليف
اصطلاحات التسميةاستخدام Closures للخصوصيةالوصول عبر Closuresجداول للقراءة فقطمنطق التحقق من الصحةمراجعة - الخزنة الآمنة11أنماط التصميم (مبسط)
دوال المصنعجدول Singletonنمط الـ Iteratorالمراقب (المستمع)مراجعة - مصنع الـ Logger3حالة الكائن وسلوكه
متغيرات النسخةدالات الجلب (Getter Methods)دالات التعيين (Setter Methods)الخصائص المحسوبةتنسيق النصوصالتحقق من المساواةمراجعة - درجة الطالب6أساسيات الوراثة
إعداد الوراثةوراثة الـ Methodsتوسيع الـ Constructorإضافة Methods للابنالمشترك مقابل الفريدملخص - التسلسل الهرمي للأشكالتدرّب بنفسك: مترجم Lua عبر الإنترنت