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 40Eine 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 chargingWenn 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 photosEin 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) : ContactInnerhalb von main:
val ada = Person("Ada", "ada@example.com")
val named: Named = ada
println(ada.card())
println(named.name)Ausgabe:
Ada <ada@example.com>
AdaAufgabe
EinfachZwei 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}")
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Klassen und Objekte
Arbeiten mit DateienKlassen definierenPrimärkonstruktoreninit-Blöcke und ValidierungSekundärkonstruktorenRückblick – Bibliotheksausweis4Vererbung
Offene Klassen und UnterklassenÜberschreiben von Membernsuper und KonstruktorenAbstrakte KlassenRückblick – Mitarbeiterverzeichnis2Eigenschaften und Kapselung
Benutzerdefinierte ZugriffsmethodenSichtbarkeitsmodifikatorenPrivate Setterlazy und lateinitWiederholung – Bankkonto5Schnittstellen
Schnittstellen deklarierenStandardmethodenMehrere SchnittstellenSchnittstellen als TypenRückblick – Zahlungsmethoden8Generics
Generische FunktionenGenerische KlassenTypbeschränkungenVarianz mit in und outRückblick – Prioritätswarteschlange11Projekt: Bibliotheksverwaltung
Bücher und MitgliederBücher ausleihenÜbe selbstständig: Kotlin-Playground