ملخص - التسلسل الهرمي للأشكال
جزء من قسم Object Oriented Programming في رحلة 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:
جميع دروس Object Oriented Programming
4مشروع: بنك رقمي
إعداد المشروعطريقة الإيداع7تعدد الأشكال وإعادة التعريف
إعادة تعريف الدوالاستدعاء دوال الفئة الأبDuck Typingواجهة مشتركةالتحقق من النوعمراجعة - أدوار الموظفين2نمط النموذج الأولي للفئات
مفهوم النموذج الأوليالربط باستخدام __indexالمنشئ :new()تهيئة الخصائصنسخ مستقلةملخص - مصنع السيارات5تحميل المعاملات في OOP
جمع الكائناتطرح الكائناتدمج الكائناتمقارنة الكائنات (<, >)مراجعة - رياضيات المحفظة8التغليف
اصطلاحات التسميةاستخدام Closures للخصوصيةالوصول عبر Closuresجداول للقراءة فقطمنطق التحقق من الصحةمراجعة - الخزنة الآمنة11أنماط التصميم (مبسط)
دوال المصنعجدول Singletonنمط الـ Iteratorالمراقب (المستمع)مراجعة - مصنع الـ Logger3حالة الكائن وسلوكه
متغيرات النسخةدالات الجلب (Getter Methods)دالات التعيين (Setter Methods)الخصائص المحسوبةتنسيق النصوصالتحقق من المساواةمراجعة - درجة الطالب6أساسيات الوراثة
إعداد الوراثةوراثة الـ Methodsتوسيع الـ Constructorإضافة Methods للابنالمشترك مقابل الفريدملخص - التسلسل الهرمي للأشكال