ביטויי אובייקט
חלק מהיחידה תכנות מונחה עצמים במסלול ה-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 } // צורת למבדהאתגר
קללממשק 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("; "))
}
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1מחלקות ואובייקטים
עבודה עם קבציםהגדרת מחלקותבנאים ראשייםבלוקי init ואימות נתוניםבנאים משנייםסיכום – כרטיס ספרייה3אובייקטים ואובייקטים נלווים
הצהרות אובייקטאובייקטים נלוויםקבועים עם constביטויי אובייקטסיכום – משרד הכרטיסיםתרגלו בעצמכם: Kotlin אונליין