ملخص - التسلسل الهرمي للأشكال
جزء من قسم البرمجة كائنية التوجه في رحلة Lua على Coddy. الدرس 36 من 70.
التحدي
سهللنقم ببناء هيكل هرمي كامل للأشكال من الصفر! ستقوم بإنشاء فئة أب Shape ترث منها جميع الأشكال، ثم ستبني فئات أبناء Circle و Square، حيث تمتلك كل منها خصائصها الفريدة مع مشاركة الوظائف العامة.
ستقوم بتنظيم الكود الخاص بك عبر أربعة ملفات:
Shape.lua: الفئة الأساسية التي سترث منها جميع الأشكال. يجب أن تحتوي على منشئ:new(color)يقوم بتخزين لون الشكل، وتابع:getColor()يقوم بإرجاعه. هذه الخاصية المشتركة تعني أن كل شكل — سواء كان دائرة أو مربعاً — سيكون له لون.Circle.lua: فئة ابن ترث من Shape. يجب أن يستدعي منشئها:new(color, radius)منشئ الأب للتعامل مع اللون، ثم يضيف نصف القطر (radius) كسمة فريدة. قم بتضمين تابع:describe()يطبع تفاصيل الدائرة.Square.lua: فئة ابن أخرى ترث من Shape. يجب أن يستدعي منشئها:new(color, side)أيضاً منشئ الأب، ثم يخزن طول الضلع (side). قم بتضمين تابع:describe()للمربعات أيضاً.main.lua: اجمع كل شيء معاً عن طريق إنشاء مثيلات (instances) لكلا الشكلين وإثبات أنهما يرثان بشكل صحيح من Shape مع الحفاظ على خصائصهما الفريدة.
ستتلقى مدخلين:
- بيانات الدائرة: اللون ونصف القطر مفصولين بفاصلة (مثلاً،
blue,5) - بيانات المربع: اللون وطول الضلع مفصولين بفاصلة (مثلاً،
red,4)
في ملفك الرئيسي، قم بإنشاء Circle و Square بالقيم المعطاة. ثم اطبع ما يلي في أسطر منفصلة:
- استدعِ
:describe()على الدائرة - استدعِ
:describe()على المربع - اطبع لون الدائرة باستخدام
:getColor() - اطبع لون المربع باستخدام
:getColor()
يجب أن يطبع التابع :describe() الخاص بـ Circle ما يلي:
Circle with radius {radius}يجب أن يطبع التابع :describe() الخاص بـ Square ما يلي:
Square with side {side}على سبيل المثال، إذا كانت المدخلات هي blue,5 و red,4، يجب أن يكون المخرج:
Circle with radius 5
Square with side 4
blue
redيوضح هذا نمط الوراثة الكامل: يرث كلا الشكلين :getColor() من Shape (لم يقوما بتعريفه بأنفسهما مطلقاً)، بينما يمتلك كل منهما سمته الفريدة وتابع :describe() الخاص به!
جرّب بنفسك
-- main.lua: تجميع كل شيء معاً
local Circle = require('Circle')
local Square = require('Square')
-- قراءة المدخلات للدائرة (اللون، نصف القطر)
local circleInput = io.read()
local circleColor, circleRadius = circleInput:match("([^,]+),([^,]+)")
circleRadius = tonumber(circleRadius)
-- قراءة المدخلات للمربع (اللون، الضلع)
local squareInput = io.read()
local squareColor, squareSide = squareInput:match("([^,]+),([^,]+)")
squareSide = tonumber(squareSide)
-- TODO: إنشاء كائن (instance) للدائرة باللون ونصف القطر المعطيين
-- TODO: إنشاء كائن (instance) للمربع باللون وطول الضلع المعطيين
-- TODO: استدعاء ()describe: على الدائرة
-- TODO: استدعاء ()describe: على المربع
-- TODO: طباعة لون الدائرة باستخدام ()getColor:
-- TODO: طباعة لون المربع باستخدام ()getColor:
جميع دروس البرمجة كائنية التوجه
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 عبر الإنترنت