وراثة الـ Methods
جزء من قسم البرمجة كائنية التوجه في رحلة Lua على Coddy. الدرس 32 من 70.
بعد إنشاء رابط inheritance، تحصل instance من الفئة الفرعية تلقائيًا على إمكانية الوصول إلى جميع methods الخاصة بالفئة الأصلية. يحدث هذا من خلال سلسلة البحث في Lua؛ فعندما تستدعي method على instance، تبحث Lua في كل جدول متصل حتى تجد ما تبحث عنه.
تأمل هذا الإعداد حيث يعرّف Animal أسلوب :breathe() من نوع method:
local Animal = {}
Animal.__index = Animal
function Animal:new()
local obj = {}
setmetatable(obj, Animal)
return obj
end
function Animal:breathe()
print("Breathing...")
end
-- Dog يرث من Animal
local Dog = {}
Dog.__index = Dog
setmetatable(Dog, {__index = Animal})
function Dog:new()
local obj = {}
setmetatable(obj, Dog)
return obj
endشاهد الآن ما يحدث عندما ننشئ كائنًا من Dog ونستدعي method الخاصة بـ Parent:
local buddy = Dog:new()
buddy:breathe() -- المخرجات: Breathing...لم تُعرِّف class الخاصة بـ Dog مطلقًا :breathe()، ومع ذلك فهي تعمل. تتحقق Lua أولًا من buddy ولا تجد شيئًا، ثم تتحقق من Dog ولا تجد شيئًا أيضًا، وأخيرًا تعثر عليها في Animal. تعني آلية method inheritance التلقائية هذه أنك تكتب السلوك المشترك مرة واحدة في الفئة الأب، وتستفيد كل فئة فرعية منه فورًا.
التحدي
سهللنَبْنِ تسلسلاً هرميًا بسيطًا للمخلوقات لنرى وراثة method أثناء العمل! ستنشئ فئة Animal الأب وفئة Dog الابن، ثم توضّح أن كائنات Dog يمكنها استخدام methods المعرّفة في Animal فقط.
ستنظّم شيفرتك عبر ثلاثة ملفات:
Animal.lua: عرّف فئة الأب باستخدام نمط الفئات القياسي. ضمّن مُنشئًا:new(name)يخزّن اسم الحيوان، وmethod:speak()تطبع اسم الحيوان متبوعًا بـmakes a sound. أعد الفئة في نهاية الملف.Dog.lua: عرّف فئة الابن التي ترث من Animal. اطلب وحدة Animal وأعدّ inheritance link بحيث يتمكن Dog من الوصول إلى methods الخاصة بـ Animal. ضمّن مُنشئًا:new(name)يخزّن الاسم ويعيّن Dog بوصفه metatable. يجب ألا تعرّف فئة Dog method:speak()خاصة بها. سترثها من Animal.main.lua: اطلب وحدة Dog، واقرأ اسمًا من input، وأنشئ instance من Dog بهذا الاسم، ثم استدعِ method:speak()عليه.
ستتلقى input واحدًا: اسم dog.
على سبيل المثال، إذا كان input هو Buddy، فيجب أن يكون Output:
Buddy makes a soundالسحر هنا هو أن فئة Dog لا تعرّف أبدًا :speak()، ومع ذلك فإن استدعاءها على instance من Dog يعمل بصورة مثالية. تتبع Lua سلسلة البحث من instance الخاص بـ Dog إلى فئة Dog، ثم إلى فئة Animal حيث تجد method. هذه هي inheritance أثناء العمل!
جرّب بنفسك
-- main.lua: نقطة الدخول
local Dog = require('Dog')
-- اقرأ اسم الكلب من الإدخال
local name = io.read()
-- TODO: أنشئ مثيل Dog بالاسم المعطى
-- TODO: استدعِ الطريقة :speak() على مثيل الكلب
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
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 عبر الإنترنت