مجموعة الأشكال
جزء من قسم Object Oriented Programming في رحلة Lua على Coddy — الدرس 59 من 70.
التحدي
سهلالآن بعد أن أصبح لديك كل من فئتي Rectangle و Circle بوظائف كاملة، دعنا ننشئ فئة ShapeCollection يمكنها إدارة أشكال متعددة معاً. هذا مثال رائع على التركيب (composition) — حيث أن المجموعة "تمتلك" أشكالاً بدلاً من أن "تكون" شكلاً.
ستقوم بإضافة ملف جديد إلى مشروعك المتنامي:
Shape.lua: فئة Shape الأساسية الخاصة بك (دون تغيير).Rectangle.lua: فئة Rectangle الخاصة بك مع:getArea()و:getPerimeter().Circle.lua: فئة Circle الخاصة بك مع:getArea()و:getPerimeter().ShapeCollection.lua: أنشئ فئة جديدة تخزن الأشكال داخلياً. قم بتضمين منشئ:new()يقوم بتهيئة قائمة فارغة من الأشكال، وطريقة:addShape(shape)تضيف أي شكل إلى المجموعة، وطريقة:count()تعيد عدد الأشكال المخزنة حالياً.main.lua: اجمع كل شيء معاً عن طريق استدعاء الوحدات (modules) الخاصة بك. اقرأ الأبعاد من المدخلات، وأنشئ Rectangle و Circle، وأضفهما معاً إلى ShapeCollection، ثم اطبع عدد عناصر المجموعة متبوعاً باسم كل شكل (بالترتيب الذي تمت إضافته به).
لا تحتاج ShapeCollection إلى معرفة ما إذا كانت تخزن مستطيلات أم دوائر — فهي تحتفظ بالأشكال فحسب. يوضح هذا كيف يتيح لك تعدد الأشكال (polymorphism) التعامل مع أنواع كائنات مختلفة بشكل موحد من خلال واجهة مشتركة.
المدخلات: ثلاثة أسطر — العرض (رقم)، والارتفاع (رقم)، ونصف القطر (رقم).
المخرجات: ثلاثة أسطر — عدد الأشكال في المجموعة، ثم اسم أول شكل تمت إضافته، ثم اسم ثاني شكل تمت إضافته.
جرّب بنفسك
-- استدعاء وحدة Rectangle
local Rectangle = require('Rectangle')
-- استدعاء وحدة Circle
local Circle = require('Circle')
-- استدعاء وحدة ShapeCollection
local ShapeCollection = require('ShapeCollection')
-- قراءة width و height من المدخلات
local width = tonumber(io.read())
local height = tonumber(io.read())
local radius = tonumber(io.read())
-- إنشاء مثيل Rectangle جديد بالأبعاد المعطاة
local rect = Rectangle:new(width, height)
-- إنشاء مثيل Circle جديد بنصف القطر المعطى
local circ = Circle:new(radius)
-- إنشاء ShapeCollection جديد
local collection = ShapeCollection:new()
-- إضافة كلا الشكلين إلى المجموعة
collection:addShape(rect)
collection:addShape(circ)
-- طباعة عدد الأشكال في المجموعة
print(collection:count())
-- طباعة اسم كل شكل بترتيب إضافتها
for i = 1, collection:count() do
print(collection.shapes[i]:getName())
end
جميع دروس Object Oriented Programming
4مشروع: بنك رقمي
إعداد المشروعطريقة الإيداع7تعدد الأشكال وإعادة التعريف
إعادة تعريف الدوالاستدعاء دوال الفئة الأبDuck Typingواجهة مشتركةالتحقق من النوعمراجعة - أدوار الموظفين10مشروع: مدير الأشكال
إعداد المشروعفئة المستطيل2نمط النموذج الأولي للفئات
مفهوم النموذج الأوليالربط باستخدام __indexالمنشئ :new()تهيئة الخصائصنسخ مستقلةملخص - مصنع السيارات5تحميل المعاملات في OOP
جمع الكائناتطرح الكائناتدمج الكائناتمقارنة الكائنات (<, >)مراجعة - رياضيات المحفظة8التغليف
اصطلاحات التسميةاستخدام Closures للخصوصيةالوصول عبر Closuresجداول للقراءة فقطمنطق التحقق من الصحةمراجعة - الخزنة الآمنة11أنماط التصميم (مبسط)
دوال المصنعجدول Singletonنمط الـ Iteratorالمراقب (المستمع)مراجعة - مصنع الـ Logger3حالة الكائن وسلوكه
متغيرات النسخةدالات الجلب (Getter Methods)دالات التعيين (Setter Methods)الخصائص المحسوبةتنسيق النصوصالتحقق من المساواةمراجعة - درجة الطالب6أساسيات الوراثة
إعداد الوراثةوراثة الـ Methodsتوسيع الـ Constructorإضافة Methods للابنالمشترك مقابل الفريدملخص - التسلسل الهرمي للأشكال