Menu
CoddyTech
flag Ar iconالعربيةdown icon

الخصائص للقراءة فقط

جزء من قسم البرمجة كائنية التوجّه في رحلة 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 * length
var room := Room.new()
print(room.area) # 20
room.width = 6
print(room.area) # 30

سيتعين تحديث var area يدويًا في كل مرة تتغير فيها width أو length، وقد يؤدي نسيان تحديث واحد إلى جعلها غير صحيحة. لا يمكن أن تصبح area المحسوبة قديمة، ولا يمكن لأحد إسناد قيمة خاطئة إليها.

استخدم ثابتًا في الفئة لقيمة تكون نفسها لكل كائن ولا تتغير أبدًا: const MAX_GUESTS = 4. يُبلَّغ عن الإسناد إلى ثابت قبل تشغيل البرنامج.

challenge icon

التحدي

سهل

يخزّن الصنف 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])
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس البرمجة كائنية التوجّه

تدرّب بنفسك: مترجم GDScript عبر الإنترنت