Menu
Coddy logo textTech

Mehrere Schnittstellen

Teil des Abschnitts Objektorientierte Programmierung der Kotlin-Journey von Coddy. Lektion 24 von 57.

Eine Klasse kann mehrere durch Kommas getrennte Schnittstellen implementieren. Sie muss die Member aller Schnittstellen implementieren:

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
}

Innerhalb von main:

val lamp = Lamp()
lamp.toggle()
lamp.level = 40
println("${lamp.isOn} ${lamp.level}")

Ausgabe:

true 40

Eine Klasse kann eine Klasse erweitern und Schnittstellen in derselben Kopfzeile implementieren. Nur die Oberklasse hat einen Konstruktoraufruf:

open class Device(val name: String)
interface Rechargeable {
    fun charge(): String
}
class Phone(name: String) : Device(name), Rechargeable {
    override fun charge() = "$name is charging"
}

Innerhalb von main:

println(Phone("Pixel").charge())

Ausgabe:

Pixel is charging

Wenn zwei Schnittstellen derselben Methode jeweils eine Standardimplementierung geben, muss die Klasse sie überschreiben und entscheiden, was zu tun ist. super<Name>.method() ruft die Version einer bestimmten Schnittstelle auf:

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()
}

Innerhalb von main:

println(SmartPhone().describe())

Ausgabe:

makes calls and takes photos

Ein Interface kann andere Interfaces erweitern. Eine Klasse, die das kombinierte Interface implementiert, muss die Member aller beteiligten Interfaces bereitstellen und gilt als jedes dieser Interfaces:

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

Innerhalb von main:

val ada = Person("Ada", "ada@example.com")
val named: Named = ada
println(ada.card())
println(named.name)

Ausgabe:

Ada <ada@example.com>
Ada
challenge icon

Aufgabe

Einfach

Zwei Schnittstellen beschreiben ein smartes Gerät: Switchable erfordert isOn (ein schreibgeschütztes Boolean für Aufrufer) und toggle(), und Dimmable erfordert eine beschreibbare Eigenschaft brightness. Implementiere beide in SmartLamp: Sie startet mit der Helligkeit 100 und ausgeschaltet, toggle() schaltet sie ein und aus, eine Helligkeit außerhalb des Bereichs von 0 bis 100 wird vom Setter begrenzt, und status() gibt on 70% oder off zurück.

Der bereitgestellte Code liest Befehle toggle oder eine Helligkeitszahl ein, wendet sie auf eine Lampe an und gibt anschließend jeweils status() aus. Danach wird überprüft, dass die Lampe Switchable und Dimmable ist.

Dein Code gehört in Switchable.kt, Dimmable.kt und SmartLamp.kt. Main.kt enthält den bereitgestellten Eingabe-/Ausgabecode und kann nicht bearbeitet werden.

Probier es selbst

fun main() {
    // Bereitgestellter Ein-/Ausgabe-Code: belasse ihn wie er ist
    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 iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Kotlin-Playground