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