Standardmethoden
Teil des Abschnitts Objektorientierte Programmierung der Kotlin-Journey von Coddy. Lektion 23 von 57.
Eine Schnittstellenmethode kann einen Rumpf haben. Diese Standardimplementierung wird von jeder Klasse verwendet, die sie nicht überschreibt:
interface Greeter {
val name: String
fun greet() = "Hello, I am $name"
}
class Robot(override val name: String) : Greeter
class Pirate(override val name: String) : Greeter {
override fun greet() = "Ahoy! $name here"
}Innerhalb von main:
println(Robot("R2").greet())
println(Pirate("Anne").greet())Ausgabe:
Hello, I am R2
Ahoy! Anne hereStandardmethoden werden in Bezug auf die anderen Member des Interfaces geschrieben. Eine Klasse stellt die wenigen Member bereit, die abweichen, und erhält den Rest:
interface Priced {
val cents: Int
fun formatted() = "$%d.%02d".format(cents / 100, cents % 100)
fun isAffordable(budget: Int) = cents <= budget
}
class Coffee : Priced {
override val cents = 450
}Innerhalb von main:
val c = Coffee()
println(c.formatted())
println(c.isAffordable(400))Ausgabe:
$4.50
falseEigenschaften können einen Standard-Getter haben, aber ein Interface hat keine zugrunde liegenden Felder und kann daher keinen Wert speichern. Eine Eigenschaft mit einem Initialisierer wird nicht kompiliert; ein Getter, der den Wert berechnet, dagegen schon:
interface Box {
val width: Int
val height: Int
val area: Int
get() = width * height
// val count = 0 // Fehler: Property-Initialisierer sind in Interfaces nicht erlaubt
}
class Tile(override val width: Int, override val height: Int) : BoxInnerhalb von main:
println(Tile(3, 4).area)Ausgabe:
12Eine Überschreibung kann weiterhin die Standardimplementierung verwenden. Innerhalb der Klasse ruft super.method() die Version des Interfaces auf:
interface Priced {
val cents: Int
fun formatted() = "$%d.%02d".format(cents / 100, cents % 100)
}
class Coffee : Priced {
override val cents = 450
override fun formatted() = "coffee " + super.formatted()
}Innerhalb von main:
println(Coffee().formatted())Ausgabe:
coffee $4.50Aufgabe
EinfachDie Schnittstelle Priced verfügt über price (in Cent). Gib ihr eine Standardimplementierung von formatted(), die $4.50 zurückgibt, sowie eine Standardimplementierung von isAffordable(budget), die zurückgibt, ob der Preis höchstens dem Budget entspricht. Coffee kostet 450 und überschreibt formatted() mit coffee $4.50, wobei die Standardimplementierung über super wiederverwendet wird. Sandwich(price) verwendet beide Standardimplementierungen.
Der bereitgestellte Code liest ein Budget in Cent und anschließend Zeilen mit coffee oder sandwich,650. Für jedes Element gibt er formatted() sowie yes oder no aus.
Dein Code gehört in Priced.kt, Coffee.kt und Sandwich.kt. Main.kt enthält den bereitgestellten Eingabe-/Ausgabecode und kann nicht bearbeitet werden.
Probier es selbst
fun main() {
// Gelieferter Ein-/Ausgabecode: belasse ihn wie er ist
val input = generateSequence(::readLine).toList()
val budget = input[0].toInt()
for (line in input.drop(1)) {
val p = line.split(",")
val item: Priced = if (p[0] == "coffee") Coffee() else Sandwich(p[1].toInt())
println("${item.formatted()} ${if (item.isAffordable(budget)) "yes" else "no"}")
}
}
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