مراجعة - حاسبة الأشكال
جزء من قسم البرمجة كائنية التوجّه في رحلة GDScript على Coddy. الدرس 25 من 65.
التحدي
متوسطأنشئ حاسبة للأشكال تتعامل مع الأشكال الحقيقية، وكائن يشبه الشكل من خارج التسلسل الهرمي، وكائنات لا يمكنها قياسها.
Shapeمجرّد، ويحتوي على الدوال المجرّدةarea() -> floatوperimeter() -> floatوshape_name() -> String. أما دالته العاديةdescribe()فتعيدNAME: area A, perimeter Pمع منزلتين عشريتين.- ترث
Circle(radius) وRectangle(widthوheight) وTriangle(أضلاعهaوbوc) منShape. أسماؤها هيCircleوRectangleوTriangle. مساحة الدائرة هيPI * r * rومحيطها2 * PI * r. وبالنسبة إلى المثلث، استخدم صيغة هيرون: حيثs = (a + b + c) / 2، تكون المساحةsqrt(s * (s - a) * (s - b) * (s - c)). - لا ترث
CustomShapeمنShape. لديهاcustom_nameوsize؛ وarea()هيsize * size، وperimeter()هي4 * size، وتستخدمdescribe()التنسيق نفسه المستخدم فيShape، مع اسمها المخصص. - تحتوي
ShapeCalculatorعلى دالتين ثابتتين. تعيدprocess(thing)القيمة[Shape]متبوعةً بنتيجةdescribe()إذا كان الكائن من النوعShape، أو[Duck]متبوعةً بنتيجةdescribe()لأي كائن آخر لديه دالةdescribe()، وتعيدCannot measure this objectفي غير ذلك. تجمعtotal_area(things)قيمarea()لكل كائن لديه دالةarea().
يقرأ الكود المقدّم عدد الكائنات التي تليه، ثم يقرأ كائنًا واحدًا في كل سطر: circle R أو rectangle W H أو triangle A B C أو custom NAME SIZE أو unknown (كائن RefCounted عادي). ويطبع process() لكل كائن، ثم المساحة الإجمالية. بالنسبة إلى circle 5 وcustom Hexa 3 وunknown، يطبع:
[Shape] Circle: area 78.54, perimeter 31.42
[Duck] Hexa: area 9.00, perimeter 12.00
Cannot measure this object
Total area: 87.54ضع الكود في shape.gd وcircle.gd وrectangle.gd وtriangle.gd وcustom_shape.gd وshape_calculator.gd. يحتوي main.gd على كود الإدخال والإخراج المقدّم، ولا يمكن تعديله.
جرّب بنفسك
extends Node
func _ready():
# كود الإدخال/الإخراج الموفَّر: اتركه كما هو
var count := int(OS.read_string_from_stdin())
var things := []
for i in count:
var p := OS.read_string_from_stdin().split(" ")
if p[0] == "circle":
things.append(Circle.new(float(p[1])))
elif p[0] == "rectangle":
things.append(Rectangle.new(float(p[1]), float(p[2])))
elif p[0] == "triangle":
things.append(Triangle.new(float(p[1]), float(p[2]), float(p[3])))
elif p[0] == "custom":
things.append(CustomShape.new(p[1], float(p[2])))
else:
things.append(RefCounted.new())
for thing in things:
print(ShapeCalculator.process(thing))
print("Total area: %.2f" % ShapeCalculator.total_area(things))
جميع دروس البرمجة كائنية التوجّه
1أساسيات البرمجة كائنية التوجه
الملفات الخارجيةمقدمة إلى البرمجة كائنية التوجهالفئات مقابل الكائناتالكلمة المفتاحية selfالأساليبالخصائصالمُنشئ (_init)مراجعة - آلة حاسبة بسيطة4تعدد الأشكال
إعادة النظر في تجاوز الأساليبكتابة الأنواع بأسلوب البطةالفئات والأساليب المجرّدةتصميم الواجهاتمراجعة - حاسبة الأشكال10أنماط التصميم، الجزء الثاني
نمط الأوامرنمط المحوّلنمط المُزيّننمط الطريقة القالبيةنمط الحالةالنمط المركّب2خصائص الأصناف
متغيرات الكائن مقابل المتغيرات الساكنةالدوال الساكنةمُعيِّنات الخصائصمُسترجِعات الخصائصخاص وفقًا للاتفاقيةمراجعة - مدير الحسابات البنكية5التغليف
الأعضاء العامة والخاصةالتحقق من الصحة باستخدام دوال الضبطإخفاء المعلوماتالخصائص للقراءة فقطمراجعة - نظام سجلات الطلاب8مفاهيم متقدمة في البرمجة كائنية التوجه
التركيب مقابل الوراثةالأصناف الداخليةالعُقد كمكوّناتRefCounted مقابل Nodeالتعدادات في الأصنافتدرّب بنفسك: مترجم GDScript عبر الإنترنت