Menu
Coddy logo textTech

Metody domyślne

Część sekcji Programowanie obiektowe ścieżki Kotlin w Coddy. Lekcja 23 z 57.

Metoda interfejsu może mieć ciało. Ta implementacja domyślna jest używana przez każdą klasę, która jej nie nadpisuje:

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

Wewnątrz main:

println(Robot("R2").greet())
println(Pirate("Anne").greet())

Wynik:

Hello, I am R2
Ahoy! Anne here

Metody domyślne są zapisane w kategoriach pozostałych składowych interfejsu. Klasa dostarcza kilka składowych, które się różnią, i otrzymuje pozostałe:

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
}

Wewnątrz main:

val c = Coffee()
println(c.formatted())
println(c.isAffordable(400))

Wynik:

$4.50
false

Właściwości mogą mieć domyślny getter, ale interfejs nie ma pól zapasowych, więc nie może przechowywać wartości. Właściwość z inicjalizatorem się nie kompiluje; getter, który oblicza wartość, działa:

interface Box {
    val width: Int
    val height: Int
    val area: Int
        get() = width * height
    // val count = 0      // błąd: inicjalizatory właściwości nie są dozwolone w interfejsach
}
class Tile(override val width: Int, override val height: Int) : Box

Wewnątrz main:

println(Tile(3, 4).area)

Wynik:

12

Nadpisanie może nadal korzystać z domyślnej implementacji. Wewnątrz klasy super.method() wywołuje wersję interfejsu:

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

Wewnątrz main:

println(Coffee().formatted())

Wynik:

coffee $4.50
challenge icon

Wyzwanie

Łatwy

Interfejs Priced ma price (w centach). Dodaj do niego domyślną funkcję formatted(), która zwraca $4.50, oraz domyślną funkcję isAffordable(budget), która zwraca informację, czy cena jest nie większa niż budżet. Coffee kosztuje 450 i zastępuje formatted() wartością coffee $4.50, ponownie wykorzystując domyślną implementację przez super. Sandwich(price) używa obu domyślnych implementacji.

Dostarczony kod odczytuje budżet w centach, a następnie wiersze coffee lub sandwich,650. Dla każdego produktu wypisuje formatted() oraz yes lub no.

Twój kod umieść w plikach Priced.kt, Coffee.kt i Sandwich.kt. Main.kt zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.

Spróbuj swoich sił

fun main() {
    // Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
    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 iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Edytor online Kotlin