Menu
Coddy logo textTech

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 here

Standardmethoden 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
false

Eigenschaften 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) : Box

Innerhalb von main:

println(Tile(3, 4).area)

Ausgabe:

12

Eine Ü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.50
challenge icon

Aufgabe

Einfach

Die 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"}")
    }
}
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