إعادة تعريف الدوال
جزء من قسم البرمجة كائنية التوجه في رحلة Lua على Coddy. الدرس 37 من 70.
حتى الآن، ورثت الفئات child أساليب الفئة الأصلية وأضافت أساليب جديدة. ولكن ماذا لو احتاجت فئة child إلى اسم الأسلوب نفسه مع سلوك مختلف؟ يُسمّى هذا تجاوز الأسلوب.
عندما تعرّف method في child class بالاسم نفسه الموجود في الصنف الأب، تكون نسخة child ذات أولوية. تتحقق سلسلة البحث في Lua من child class أولًا، وإذا وجدت method هناك، تتوقف عن البحث.
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 يتجاوز speak()
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()
print(self.name .. " barks: Woof!")
endالآن تستجيب كل فئة بشكل مختلف لاستدعاء الأسلوب نفسه:
local generic = Animal:new("Creature")
local buddy = Dog:new("Buddy")
generic:speak() -- المخرجات: Creature يصدر صوتًا
buddy:speak() -- المخرجات: Buddy ينبح: Woof!تستبدل :speak() الخاصة بـ Dog إصدار الفئة الأصلية بالكامل لمثيلات Dog. يتيح لك ذلك إنشاء سلوك متخصص مع الحفاظ على واجهة متسقة: يمكن لكل animal استخدام :speak()، لكن كل نوع يفعل ذلك بطريقة مختلفة.
التحدي
سهللنبنِ مملكة حيوانات صغيرة تتحدث فيها المخلوقات المختلفة بطرقها الفريدة! ستنشئ فئة Animal أساسية وفئتين فرعيتين، Cat وCow، بحيث تعيد كل منهما تعريف طريقة :speak() الخاصة بالفئة الأساسية بسلوكها المتخصص.
ستنظّم التعليمات البرمجية عبر أربعة ملفات:
Animal.lua: فئةBaseالخاصة بك، مع مُنشئ:new(name)يخزّن اسم الحيوان. أدرج طريقة:speak()تطبع اسم الحيوان متبوعًا بـmakes a sound. هذا هو السلوك الافتراضي الذي ستعيد الفئات الفرعية تعريفه.Cat.lua: فئة فرعية ترث من Animal. يجب أن يستدعي مُنشئها:new(name)مُنشئ الفئة الأساسية، ثم يعيد ربط جدول البيانات الوصفية بـ Cat. أعد تعريف طريقة:speak()لكي تقول cats شيئًا مختلفًا: اطبع اسم cat متبوعًا بـmeows: Meow!Cow.lua: فئة فرعية أخرى ترث من Animal. أنشئ المُنشئ بالطريقة نفسها المتّبعة في Cat. أعد تعريف:speak()لكي تطبع cows اسمها متبوعًا بـmoos: Moo!main.lua: اجمع everything معًا! اقرأ اسمين من input، وأنشئ Cat بالاسم first وCow بالاسم الثاني، ثم استدعِ:speak()على كل منهما لإظهار أن اسم method نفسه ينتج مخرجات مختلفة اعتمادًا على الفئة.
ستتلقى inputين:
- اسم cat
- اسم cow
في ملف main، أنشئ الحيوانين واستدعِ :speak() على cat أولًا، ثم على cow.
على سبيل المثال، إذا كانت المدخلات هي Whiskers وBessie، فيجب أن تكون المخرجات:
Whiskers meows: Meow!
Bessie moos: Moo!لاحظ كيف يستجيب الحيوانان لاستدعاء method نفسه :speak()، لكن كلًا منهما ينتج مخرجات خاصة بنوعه. إصدار Cat يستبدل بالكامل سلوك الفئة الأساسية generic "makes a sound"، وكذلك إصدار Cow. هذا هو تجاوز method عمليًا: الواجهة نفسها، وتنفيذات مختلفة!
جرّب بنفسك
-- main.lua: اجمع كل شيء معًا
local Cat = require('Cat')
local Cow = require('Cow')
-- اقرأ الإدخال
local catName = io.read()
local cowName = io.read()
-- TODO: أنشئ Cat بالاسم الأول
-- TODO: أنشئ Cow بالاسم الثاني
-- 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 عبر الإنترنت