Menu
Coddy logo textTech

ביטויי אובייקט

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

ביטוי אובייקט יוצר אובייקט חד־פעמי של מחלקה ללא שם, בדיוק במקום שבו הוא נדרש. כותבים אותו כך: object : Type { ... }, והוא בדרך כלל מממש ממשק. ממשק מפרט מתודות בלי לומר כיצד הן פועלות; פרק 5 עוסק בממשקים לעומק:

interface Greeter {
    fun greet(name: String): String
}

בתוך main:

val polite = object : Greeter {
    override fun greet(name: String) = "Good morning, $name."
}
println(polite.greet("Ada"))

פלט:

Good morning, Ada.

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

interface Counter {
    fun next(): Int
}

fun counterFrom(start: Int): Counter {
    var current = start
    return object : Counter {
        override fun next() = current++
    }
}

בתוך main:

val a = counterFrom(10)
val b = counterFrom(1)
println("${a.next()} ${a.next()} ${b.next()}")

פלט:

10 11 1

שימוש נפוץ הוא העברת ההתנהגות לפונקציה של ספרייה. sortedWith מקבלת Comparator, ממשק שהמתודה compare(a, b) שלו מחזירה מספר שלילי כאשר a מופיע קודם, אפס במקרה של שוויון ומספר חיובי אחרת:

בתוך main:

val words = listOf("kiwi", "fig", "banana", "apple")
val byLength = object : Comparator<String> {
    override fun compare(a: String, b: String) = a.length - b.length
}
println(words.sortedWith(byLength))

פלט:

[fig, kiwi, apple, banana]

ביטוי אובייקט ללא טיפוס־על מקבץ כמה ערכים לאובייקט מקומי; אפשר להשתמש במאפיינים שלו בתוך אותה פונקציה. כאשר לממשק יש מתודה אחת בלבד, למבדה לרוב קצרה יותר מביטוי אובייקט. ביטויי אובייקט מתאימים כשיש כמה מתודות או מצב שצריך לשמור.

val size = object {
    val width = 3
    val height = 4
}
println(size.width * size.height)                    // 12

val byLength = Comparator<String> { a, b -> a.length - b.length }   // צורת למבדה
challenge icon

אתגר

קל

לממשק Validator יש מתודה אחת, check(text), שמחזירה הודעת שגיאה או null כאשר הטקסט עומד בדרישות. השלימו את הפונקציה rules(minLength) כך שתחזיר שלושה מאמתים שנוצרו באמצעות ביטויי אובייקט, בסדר הזה: הטקסט חייב להכיל לפחות minLength תווים (too short), להכיל ספרה (needs a digit) ולא להכיל רווחים (no spaces allowed).

הקוד שסופק קורא את האורך המינימלי ולאחר מכן סיסמה אחת בכל שורה. הוא מדפיס ok, או את כל הודעות השגיאה של אותה סיסמה כשהן מחוברות באמצעות ; .

הקוד שלכם ייכתב בקבצים Rules.kt ו־Validator.kt. הקובץ Main.kt מכיל את קוד הקלט/פלט שסופק, ואי אפשר לערוך אותו.

נסו בעצמכם

fun main() {
    // קוד הקלט/פלט שסופק: יש להשאיר אותו כפי שהוא
    val input = generateSequence(::readLine).toList()
    val checks = rules(input[0].toInt())
    for (password in input.drop(1)) {
        val problems = checks.mapNotNull { it.check(password) }
        println(if (problems.isEmpty()) "ok" else problems.joinToString("; "))
    }
}
quiz iconבחנו את עצמכם

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

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

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