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

إعادة تعريف الدوال

جزء من قسم البرمجة كائنية التوجه في رحلة 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()، لكن كل نوع يفعل ذلك بطريقة مختلفة.

challenge icon

التحدي

سهل

لنبنِ مملكة حيوانات صغيرة تتحدث فيها المخلوقات المختلفة بطرقها الفريدة! ستنشئ فئة 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ين:

  1. اسم cat
  2. اسم 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() على القطة أولاً، ثم على البقرة
quiz iconاختبر نفسك

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

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

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