Menu
Coddy logo textTech

הצהרות אובייקט

חלק מהיחידה תכנות מונחה עצמים במסלול ה-Kotlin של Coddy. שיעור 12 מתוך 57.

object Name { ... } מצהיר על מחלקה ועל המופע היחיד שלה בצעד אחד. משתמשים באובייקט באמצעות שמו; אין בנאי שצריך לקרוא לו:

object AppConfig {
    var theme = "light"
    val version = "1.4"

    fun describe() = "v$version, $theme theme"
}

בתוך main:

println(AppConfig.describe())
AppConfig.theme = "dark"
println(AppConfig.describe())

פלט:

v1.4, light theme
v1.4, dark theme

יש מופע אחד בדיוק, ולכן כל חלק בתוכנית שמשתמש באובייקט קורא ומשנה את אותו מצב. האובייקט נוצר בפעם הראשונה שמשתמשים בו, כפי שמוצג בבלוק init שלהלן:

object Visits {
    var count = 0
        private set

    init { println("Visits created") }

    fun record() { count++ }
}

fun home() = Visits.record()
fun about() { Visits.record(); Visits.record() }

בתוך main:

println("start")
home()
about()
println(Visits.count)

פלט:

start
Visits created
3

לאובייקט אין בנאי, כי אף אחד לא יוצר אותו. המאפיינים שלו מקבלים את הערכים שלהם בהצהרות שלהם או בתוך init. מלבד זאת, זהו גוף מחלקה רגיל: מצב פרטי, פונקציות עזר פרטיות ומתודות ציבוריות:

object IdGenerator {
    private var next = 1

    fun newId(prefix: String) = "$prefix-${pad(next++)}"

    private fun pad(n: Int) = n.toString().padStart(3, '0')
}

בתוך main:

println(IdGenerator.newId("user"))
println(IdGenerator.newId("order"))

פלט:

user-001
order-002

השתמש באובייקט עבור דבר שיש ממנו בדיוק עותק אחד בתוכנית: רישום, הגדרות או קבוצת פונקציות עזר. אובייקט הוא מצב גלובלי שכל קובץ יכול לשנות, לכן השאר את פונקציות הקביעה שלו פרטיות ותן למתודות שלו לבדוק כל שינוי.

object Units {
    fun kmToMiles(km: Double) = km * 0.621371
}
Units.kmToMiles(10.0)        // נקרא דרך השם
// val u = Units()           // שגיאה: ל־object אין בנאי
challenge icon

אתגר

קל

השלם את האובייקט Leaderboard. הוא שומר את הנקודות של כל שחקן במפה פרטית. add(player, points) מוסיפה נקודות, top() מחזירה את המוביל בתור ada 6 (כשיש שוויון בנקודות, השם שמופיע ראשון בסדר אלפביתי) או empty כשלאף אחד אין נקודות, reset() מסירה את כולם, והמאפיין players הוא מספר השחקנים.

פונקציות העזר recordWin ו-recordDraw שב-Functions.kt מסופקות: הן משתמשות ב-Leaderboard מקובץ אחר. הקוד שסופק קורא פקודות win ada, draw ada bo, top או reset, מדפיס את top() עבור כל top, ולבסוף את players: עם המספר.

הקוד שלך נמצא בקבצים Leaderboard.kt ו-Functions.kt. הקובץ Main.kt מכיל את קוד הקלט/פלט שסופק ואי אפשר לערוך אותו.

נסו בעצמכם

fun main() {
    // קוד הקלט/פלט שסופק: יש להשאיר אותו כפי שהוא
    val input = generateSequence(::readLine).toList()
    for (cmd in input) {
        val p = cmd.split(" ")
        when (p[0]) {
            "win" -> recordWin(p[1])
            "draw" -> recordDraw(p[1], p[2])
            "reset" -> Leaderboard.reset()
            else -> println(Leaderboard.top())
        }
    }
    println("players: ${Leaderboard.players}")
}
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: Kotlin אונליין