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