مجموعة الأشكال
جزء من قسم البرمجة كائنية التوجه في رحلة Lua على Coddy. الدرس 59 من 70.
التحدي
سهلالآن بعد أن أصبح لديك فئتَا Rectangle وCircle بكامل وظائفهما، لننشئ فئة ShapeCollection يمكنها إدارة أشكال متعددة معًا. هذا مثال رائع على التركيب: المجموعة "has" أشكالًا بدلًا من أن "being" شكلًا.
ستضيف ملفًا جديدًا إلى مشروعك المتنامي:
Shape.lua: فئة Shape الأساسية الخاصة بك (من دون تغيير).Rectangle.lua: فئة Rectangle الخاصة بك مع:getArea()و:getPerimeter().Circle.lua: فئة Circle الخاصة بك مع:getArea()و:getPerimeter().ShapeCollection.lua: أنشئ فئة جديدة تخزّن الأشكال داخليًا. ضمّن مُنشئًا:new()يهيّئ قائمة فارغة من الأشكال، وطريقة:addShape(shape)تضيف أي شكل إلى المجموعة، وطريقة:count()تُرجع عدد الأشكال المخزّنة حاليًا.main.lua: اجمع كل شيء معًا من خلال طلب الوحدات الخاصة بك. اقرأ الأبعاد من الإدخال، وأنشئ Rectangle وCircle، وأضف كليهما إلى ShapeCollection، ثم اطبع عدد عناصر المجموعة متبوعًا باسم كل شكل (بالترتيب الذي أُضيفت به).
لا تحتاج ShapeCollection إلى معرفة ما إذا كانت تخزّن مستطيلات أم دوائر. فهي تحتفظ بالأشكال فحسب. يوضّح هذا كيف تتيح لك تعدد الأشكال التعامل مع أنواع مختلفة من الكائنات بطريقة موحّدة من خلال واجهة مشتركة.
الإدخال: ثلاثة أسطر: العرض (number)، والارتفاع (number)، ونصف القطر (number).
الإخراج: ثلاثة أسطر: عدد الأشكال في المجموعة، ثم اسم الشكل الأول المُضاف، ثم اسم الشكل الثاني المُضاف.
جرّب بنفسك
-- تتطلب وحدة Rectangle
local Rectangle = require('Rectangle')
-- تتطلب وحدة Circle
local Circle = require('Circle')
-- تتطلب وحدة ShapeCollection
local ShapeCollection = require('ShapeCollection')
-- اقرأ العرض والارتفاع من الإدخال
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
جميع دروس البرمجة كائنية التوجه
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 للابنالمشترك مقابل الفريدملخص - التسلسل الهرمي للأشكالتدرّب بنفسك: مترجم Lua عبر الإنترنت