مُعيّنات خاصة
جزء من قسم البرمجة كائنية التوجه في رحلة Kotlin على Coddy. الدرس 9 من 57.
غالبًا ما ينبغي للكود الخارجي أن يقرأ خاصيةً، ولكن لا ينبغي له تغييرها. يحافظ private set على إتاحة getter للعامة ويجعل setter خاصًا فقط:
class Counter {
var count = 0
private set
fun increment() {
count++
}
}داخل main:
val c = Counter()
c.increment()
println(c.count)
// c.count = 99 // خطأ: الـ setter خاصالناتج:
1يناسب هذا القيم التي قد تتغير فقط من خلال قاعدة، مثل نتيجة لا تنمو إلا من خلال مكافآت صالحة:
class Player(val name: String) {
var score = 0
private set
private val _history = mutableListOf<Int>()
val history: List<Int> get() = _history
fun award(points: Int) {
if (points <= 0) return
score += points
_history.add(points)
}
}داخل main:
val p = Player("Ada")
p.award(10)
p.award(-5)
p.award(3)
println(p.score)
println(p.history)الناتج:
13
[10, 3]يعرض history أعلاه نمطًا شائعًا: قائمة MutableList خاصة داخل الصنف، مكشوفة كقائمة للقراءة فقط من النوع List. يمكن للمستدعين قراءة العناصر، لكن لا يملكون add أو remove لتغييرها:
private val _items = mutableListOf<String>()
val items: List<String> get() = _items // عرض للقراءة فقط
// خارج: items.add("x") // خطأ: List ليس لديها addلا تتغير قيمة val أبدًا بعد إنشائها، ولا حتى داخل الصنف. تظل var مع private set قابلة للتغيير داخل الصنف فقط. اختر val للقيم الثابتة طوال فترة وجود الكائن:
class Order(val id: Int) { // لا يتغير أبداً
var status = "new"
private set // يتغير، ولكن فقط داخل Order
fun ship() { status = "shipped" }
}التحدي
سهلأكمل الصنف Elevator(val topFloor: Int). يمكن قراءة floor وtrips من خارج الصنف، لكن لا يمكن تغييرهما إلا داخل الصنف (private set). تنقل goTo(target) بين الطابق 0 وtopFloor: تؤدي الحركة الصالحة إلى طابق مختلف إلى تحديث floor، وإضافة 1 إلى trips، وإرجاع true؛ أما الحركة غير الصالحة أو إلى الطابق نفسه فتعيد false.
يقرأ الكود المزوَّد الطابق العلوي ثم الطوابق المستهدفة. ويطبع floor 3 بعد الحركة، أو stay 3 عند رفض الحركة، وأخيرًا يطبع trips: مع العدد.
يجب وضع كودك في Elevator.kt. يحتوي Main.kt على كود الإدخال/الإخراج المزوَّد، ولا يمكن تعديله.
جرّب بنفسك
fun main() {
// كود الإدخال/الإخراج المُزوَّد: أبقِه كما هو
val input = generateSequence(::readLine).toList()
val lift = Elevator(input[0].toInt())
for (line in input.drop(1)) {
val moved = lift.goTo(line.toInt())
println("${if (moved) "floor" else "stay"} ${lift.floor}")
}
println("trips: ${lift.trips}")
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
1الفئات والكائنات
العمل مع الملفاتتعريف الفئاتالمنشئات الأساسيةكتل init والتحقق من الصحةالمنشئات الثانويةمراجعة - بطاقة المكتبة4الوراثة
الأصناف المفتوحة والأصناف الفرعيةتجاوز الأعضاءsuper والمنشئاتالأصناف المجرّدةمراجعة - دليل الموظفينتدرّب بنفسك: Playground لـ Kotlin