משני נראות
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Kotlin של Coddy. שיעור 8 מתוך 57.
כימוס פירושו שמחלקה שולטת באופן השימוש בנתונים שלה. משנה הנראות קובעים מי יכול לראות איבר. private מסתיר אותו מכל מה שנמצא מחוץ למחלקה, ולכן המתודות של המחלקה עצמה הן הדרך היחידה לגשת אליו:
class Account {
private var balance = 0
fun deposit(amount: Int) {
if (amount > 0) balance += amount
}
fun report() = "balance: $balance"
}בתוך main:
val a = Account()
a.deposit(50)
a.deposit(-999)
println(a.report())
// a.balance = 1_000_000 // שגיאה: לא ניתן לגשת ל-'balance': הוא פרטיפלט:
balance: 50ל-Kotlin יש ארבעה משנה גישה. ללא אחד מהם, הצהרה היא public, וגלויה בכל מקום:
public // ברירת מחדל: גלוי בכל מקום
internal // גלוי באותו מודול (אפליקציה או ספרייה)
protected // גלוי במחלקה ובמחלקות הנגזרות ממנה
private // גלוי בתוך המחלקה (או הקובץ, עבור הצהרות ברמה העליונה)פונקציות עזר פרטיות שומרות על ממשק ציבורי מצומצם. הקוראים רואים מה המחלקה עושה, ולא איך:
class Password(private val text: String) {
val isStrong: Boolean
get() = hasDigit() && text.length >= 8
private fun hasDigit() = text.any { it.isDigit() }
}בתוך main:
println(Password("secret123").isStrong)
println(Password("short1").isStrong)פלט:
true
falseגם למאפייני בנאי אפשר להוסיף מצייני שינוי: private val מאחסן ערך שקוד חיצוני אינו יכול לקרוא. הסתרת נתונים מאפשרת למחלקה לבדוק כל שינוי ולשמור על הכללים שלה:
class Locker(private val code: String) {
private val items = mutableListOf<String>()
fun store(item: String, code: String): Boolean {
if (code != this.code) return false
items.add(item)
return true
}
}אתגר
קלהשלם את המחלקה Locker(private val code: String). רשימת items שלה פרטית. store(item, code) מוסיפה את הפריט רק כאשר הקוד תואם ומחזירה אם הוא נוסף; open(code) מחזירה את הפריטים כשהם מחוברים באמצעות , (או empty) כאשר הקוד תואם, ואחרת wrong code.
הקוד שסופק קורא את קוד המנעול ולאחר מכן פקודות put <code> <item> או open <code>. הוא מדפיס stored או denied עבור כל put ואת התוצאה של כל open.
הקוד שלך ייכתב בתוך Locker.kt. הקובץ Main.kt מכיל את קוד הקלט/פלט שסופק ואי אפשר לערוך אותו.
נסו בעצמכם
fun main() {
// קוד קלט/פלט שסופק: יש להשאיר אותו כפי שהוא
val input = generateSequence(::readLine).toList()
val locker = Locker(input[0])
for (cmd in input.drop(1)) {
val p = cmd.split(" ")
if (p[0] == "put") println(if (locker.store(p[2], p[1])) "stored" else "denied")
else println(locker.open(p[1]))
}
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1מחלקות ואובייקטים
עבודה עם קבציםהגדרת מחלקותבנאים ראשייםבלוקי init ואימות נתוניםבנאים משנייםסיכום – כרטיס ספרייהתרגלו בעצמכם: Kotlin אונליין