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

إضافة 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 تخصيص السلوك مع إبقاء الوظائف المشتركة في مكان واحد.

challenge icon

التحدي

سهل

لنَبْنِ تسلسلاً هرميًا للحيوانات الأليفة حيث تتمتع القطط بقدرة خاصة بها! ستنشئ فئة أب 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()
quiz iconاختبر نفسك

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

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

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