Menu
Coddy logo textTech

ממשקים מרובים

חלק מהיחידה תכנות מונחה עצמים במסלול ה-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
challenge icon

אתגר

קל

שתי ממשקים מתארים מכשיר חכם: 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}")
}
quiz iconבחנו את עצמכם

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

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

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