Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

مُعيّنات خاصة

جزء من قسم البرمجة كائنية التوجه في رحلة 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" }
}
challenge icon

التحدي

سهل

أكمل الصنف 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}")
}
quiz iconاختبر نفسك

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

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

تدرّب بنفسك: Playground لـ Kotlin