ממשקים מרובים
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Kotlin של Coddy. שיעור 24 מתוך 57.
מחלקה יכולה לממש כמה ממשקים, המופרדים בפסיקים. עליה לממש את החברים של כולם:
interface Switchable {
var isOn: Boolean
fun toggle() { isOn = !isOn }
}
interface Dimmable {
var level: Int
}
class Lamp : Switchable, Dimmable {
override var isOn = false
override var level = 100
}בתוך main:
val lamp = Lamp()
lamp.toggle()
lamp.level = 40
println("${lamp.isOn} ${lamp.level}")פלט:
true 40מחלקה יכולה להרחיב מחלקה אחת ולממש ממשקים באותה כותרת. רק למחלקת־העל יש קריאה לבנאי:
open class Device(val name: String)
interface Rechargeable {
fun charge(): String
}
class Phone(name: String) : Device(name), Rechargeable {
override fun charge() = "$name is charging"
}בתוך main:
println(Phone("Pixel").charge())פלט:
Pixel is chargingכאשר שתי ממשקים מספקים לשיטה אותה גוף ברירת מחדל, המחלקה חייבת לדרוס אותה ולהחליט מה לעשות. super<Name>.method() קוראת לגרסה של ממשק מסוים:
interface Camera {
fun describe() = "takes photos"
}
interface Telephone {
fun describe() = "makes calls"
}
class SmartPhone : Camera, Telephone {
override fun describe() = super<Telephone>.describe() + " and " + super<Camera>.describe()
}בתוך main:
println(SmartPhone().describe())פלט:
makes calls and takes photosממשק יכול להרחיב ממשקים אחרים. מחלקה שמממשת את הממשק המשולב חייבת לספק את האיברים של כולם, והיא נחשבת לכל אחד מהם:
interface Named {
val name: String
}
interface Contact : Named {
val email: String
fun card() = "$name <$email>"
}
class Person(override val name: String, override val email: String) : Contactבתוך main:
val ada = Person("Ada", "ada@example.com")
val named: Named = ada
println(ada.card())
println(named.name)פלט:
Ada <ada@example.com>
Adaאתגר
קלשתי ממשקים מתארים מכשיר חכם: Switchable דורש את isOn (Boolean לקריאה בלבד עבור הקוראים) ואת toggle(), ו-Dimmable דורש את brightness שניתן לשנות. ממשו את שניהם ב-SmartLamp: הוא מתחיל כבוי בבהירות 100, toggle() מדליק ומכבה אותו, ערך בהירות מחוץ לטווח 0 עד 100 מוגבל על ידי ה-setter, ו-status() מחזירה on 70% או off.
הקוד שסופק קורא פקודות toggle או מספר בהירות, מחיל אותן על מנורה אחת ומדפיס status() אחרי כל פקודה, ואז בודק שהמנורה היא Switchable ו-Dimmable.
הקוד שלכם ייכתב בקבצים Switchable.kt, Dimmable.kt ו-SmartLamp.kt. הקובץ Main.kt מכיל את קוד הקלט/פלט שסופק ואי אפשר לערוך אותו.
נסו בעצמכם
fun main() {
// קוד הקלט/פלט שסופק: יש להשאיר אותו כפי שהוא
val input = generateSequence(::readLine).toList()
val lamp = SmartLamp()
for (cmd in input) {
if (cmd == "toggle") lamp.toggle() else lamp.brightness = cmd.toInt()
println(lamp.status())
}
println("switchable: ${(lamp as Any) is Switchable}, dimmable: ${(lamp as Any) is Dimmable}")
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1מחלקות ואובייקטים
עבודה עם קבציםהגדרת מחלקותבנאים ראשייםבלוקי init ואימות נתוניםבנאים משנייםסיכום – כרטיס ספרייהתרגלו בעצמכם: Kotlin אונליין