الخصائص للقراءة فقط
جزء من قسم البرمجة كائنية التوجّه في رحلة GDScript على Coddy. الدرس 29 من 65.
ينبغي أن تكون بعض القيم قابلة للقراءة من الخارج، لكن لا يمكن إسناد قيمة إليها مطلقًا: مثل معرّف يُحدَّد مرة واحدة عند إنشاء الكائن، أو قيمة تُحسب من بيانات أخرى، مثل المساحة أو الإجمالي. تحقق خاصية تحتوي على كتلة get ولا تحتوي على كتلة set ذلك:
# ticket.gd
class_name Ticket
extends RefCounted
var _number: int
var number: int:
get:
return _number
func _init(start_number: int) -> void:
_number = start_numberيخزّن المُنشئ القيمة في _number الخاص، ولا تُرجع الخاصية العامة number إلا هذه القيمة. إسناد قيمة إلى number من الخارج ليس خطأً، لكنه لا يغيّر شيئًا، لأن المُعترِض getter يواصل إرجاع _number:
var ticket := Ticket.new(42)
ticket.number = 7
print(ticket.number) # 42الخاصية المحسوبة ليس لها قيمة خاصة بها: إذ يحسب المُحصِّل قيمتها في كل مرة تُقرأ فيها، لذا فهي تطابق دائمًا البيانات التي تستمد منها قيمتها:
# room.gd
class_name Room
extends RefCounted
var width: int = 4
var length: int = 5
var area: int:
get:
return width * lengthvar room := Room.new()
print(room.area) # 20
room.width = 6
print(room.area) # 30سيتعين تحديث var area يدويًا في كل مرة تتغير فيها width أو length، وقد يؤدي نسيان تحديث واحد إلى جعلها غير صحيحة. لا يمكن أن تصبح area المحسوبة قديمة، ولا يمكن لأحد إسناد قيمة خاطئة إليها.
استخدم ثابتًا في الفئة لقيمة تكون نفسها لكل كائن ولا تتغير أبدًا: const MAX_GUESTS = 4. يُبلَّغ عن الإسناد إلى ثابت قبل تشغيل البرنامج.
التحدي
سهليخزّن الصنف Order في order.gd معرّفه في _id ومجموع كل بند في _line_totals (السعر مضروبًا في الكمية). اجعل خصائصه العامة الأربع للقراءة فقط باستخدام كتل get:
- تعيد
order_idالقيمة_id. - تعيد
subtotalمجموع_line_totals. - تعيد
shippingالقيمة0عندما يكون المجموع الفرعي50أو أكثر، وإلا فتعيد5. - تعيد
totalالمجموع الفرعي بالإضافة إلى تكلفة الشحن.
يقرأ الكود المقدّم معرّف الطلب، وعدد العناصر، ثم سطرًا واحدًا بصيغة price quantity لكل عنصر. بعد كل عنصر، يطبع المجموع الفرعي وتكلفة الشحن والإجمالي. في النهاية، يحاول تعيين القيمة 0 إلى الخصائص الأربع كلها، ثم يطبع المعرّف والإجمالي، اللذين يجب ألا يتغيرا. بالنسبة إلى المعرّف 7 والعنصرين 12 2 و30 1، يطبع:
Subtotal 24, shipping 5, total 29
Subtotal 54, shipping 0, total 54
Order #7: 54ضع الكود في order.gd. يحتوي main.gd على كود الإدخال/الإخراج المقدّم ولا يمكن تعديله.
جرّب بنفسك
extends Node
func _ready():
# شيفرة الإدخال والإخراج المقدَّمة: أبقِها كما هي
var order := Order.new(int(OS.read_string_from_stdin()))
var count := int(OS.read_string_from_stdin())
for i in count:
var parts := OS.read_string_from_stdin().split(" ")
order.add_item(int(parts[0]), int(parts[1]))
print("Subtotal %d, shipping %d, total %d" % [order.subtotal, order.shipping, order.total])
# شيفرة تحاول الكتابة فوق الخصائص المخصّصة للقراءة فقط
order.order_id = 0
order.subtotal = 0
order.shipping = 0
order.total = 0
print("Order #%d: %d" % [order.order_id, order.total])
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجّه
1أساسيات البرمجة كائنية التوجه
الملفات الخارجيةمقدمة إلى البرمجة كائنية التوجهالفئات مقابل الكائناتالكلمة المفتاحية selfالأساليبالخصائصالمُنشئ (_init)مراجعة - آلة حاسبة بسيطة4تعدد الأشكال
إعادة النظر في تجاوز الأساليبكتابة الأنواع بأسلوب البطةالفئات والأساليب المجرّدةتصميم الواجهاتمراجعة - حاسبة الأشكال10أنماط التصميم، الجزء الثاني
نمط الأوامرنمط المحوّلنمط المُزيّننمط الطريقة القالبيةنمط الحالةالنمط المركّب2خصائص الأصناف
متغيرات الكائن مقابل المتغيرات الساكنةالدوال الساكنةمُعيِّنات الخصائصمُسترجِعات الخصائصخاص وفقًا للاتفاقيةمراجعة - مدير الحسابات البنكية5التغليف
الأعضاء العامة والخاصةالتحقق من الصحة باستخدام دوال الضبطإخفاء المعلوماتالخصائص للقراءة فقطمراجعة - نظام سجلات الطلاب8مفاهيم متقدمة في البرمجة كائنية التوجه
التركيب مقابل الوراثةالأصناف الداخليةالعُقد كمكوّناتRefCounted مقابل Nodeالتعدادات في الأصنافتدرّب بنفسك: مترجم GDScript عبر الإنترنت