إضافة Methods للابن
جزء من قسم البرمجة كائنية التوجه في رحلة Lua على Coddy. الدرس 34 من 70.
يتيح Inheritance لفئات child الوصول إلى methods الخاصة بالأب، لكن القوة الحقيقية تأتي من إضافة methods جديدة لا يمتلكها إلا child. يمكن لـ Dog القيام بكل ما يمكن لـ Animal القيام به، بالإضافة إلى أشياء فريدة للكلاب، مثل النباح.
إضافة method خاص بـ child أمر مباشر: ما عليك سوى تعريفه في جدول class الخاص بـ child. وبما أن instances تبحث عن methods في class الخاص بها أولًا، فستعثر على method الجديد دون التأثير في الفئة الأصلية.
local Animal = {}
Animal.__index = Animal
function Animal:new(name)
local obj = {name = name}
setmetatable(obj, Animal)
return obj
end
function Animal:breathe()
print(self.name .. " is breathing")
end
-- Dog يرث من Animal
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
-- دالة جديدة فقط في Dog
function Dog:bark()
print(self.name .. " says: Woof!")
endالآن يمكن لنسخ Dog استخدام كلٍّ من methods inherited والفريدة:
local buddy = Dog:new("Buddy")
buddy:breathe() -- الإخراج: Buddy يتنفس (موروث)
buddy:bark() -- الإخراج: Buddy يقول: Woof! (خاص بالابن فقط)تبقى الفئة الأصلية دون تغيير: إن استدعاء :bark() على Animal عادي سيفشل، لأن هذا method غير موجود فيها. هكذا تتيح لك inheritance تخصيص السلوك مع إبقاء الوظائف المشتركة في مكان واحد.
التحدي
سهللنَبْنِ تسلسلاً هرميًا للحيوانات الأليفة حيث تتمتع القطط بقدرة خاصة بها! ستنشئ فئة أب Pet وفئة ابن Cat، حيث ترث Cat كل شيء من Pet، لكنها تمتلك أيضًا طريقة فريدة لا تستطيع القيام بها إلا القطط.
ستنظّم التعليمات البرمجية عبر ثلاثة ملفات:
Pet.lua: عرّف فئة الأب باستخدام مُنشئ:new(name)يخزّن اسم الحيوان الأليف. أضف طريقة:greet()تطبع اسم الحيوان الأليف متبوعًا بـsays hello. أعد إعداد النمط القياسي للفئات وأعد الفئة.Cat.lua: عرّف فئة الابن التي ترث من Pet. يجب أن يستدعي مُنشئ:new(name)الخاص بـ Cat مُنشئ الأب لتهيئة الاسم، ثم يعيد ربط جدول البيانات الوصفية بـ Cat. أضف طريقة خاصة بالابن:purr()تطبع اسم القطة متبوعًا بـpurrs contentedly. هذه الطريقة موجودة فقط في Cat: لا تملكها Pet!main.lua: اطلب وحدة Cat، واقرأ اسمًا من الإدخال، وأنشئ نسخة من Cat، وأثبت أنها تستطيع استخدام طريقة:greet()الموروثة وطريقة:purr()الفريدة الخاصة بها.
ستتلقى مُدخلًا واحدًا: اسم القطة.
في ملفك الرئيسي، أنشئ Cat بالاسم المُعطى، ثم استدعِ :greet() متبوعًا بـ :purr() في سطرين منفصلين.
على سبيل المثال، إذا كان الإدخال هو Whiskers، فيجب أن يكون الناتج:
Whiskers says hello
Whiskers purrs contentedlyيأتي السطر الأول من طريقة :greet() الموروثة والمُعرّفة في Pet، بينما يأتي السطر الثاني من طريقة :purr() الموجودة فقط في Cat. يوضح هذا كيف تستطيع فئات الأبناء القيام بكل ما يستطيع الأب القيام به، بالإضافة إلى سلوكياتها المتخصصة الخاصة!
جرّب بنفسك
-- main.lua: أنشئ Cat وأظهر الوراثة
local Cat = require('Cat')
-- اقرأ اسم القطة من الإدخال
local name = io.read()
-- TODO: أنشئ كائن Cat بالاسم المعطى
-- TODO: استدعِ الدالة الموروثة :greet() (من Pet)
-- TODO: استدعِ الدالة الخاصة بـ Cat :purr()
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
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 عبر الإنترنت