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 hereMetody 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
falseWł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) : BoxWewnątrz main:
println(Tile(3, 4).area)Wynik:
12Nadpisanie 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.50Wyzwanie
ŁatwyInterfejs 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"}")
}
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Klasy i obiekty
Praca z plikamiDefiniowanie klasKonstruktory główneBloki init i walidacjaKonstruktory dodatkowePodsumowanie — karta biblioteczna4Dziedziczenie
Klasy otwarte i podklasyNadpisywanie składowychsuper i konstruktoryKlasy abstrakcyjnePodsumowanie – katalog pracowników7Klasy specjalne
Klasy danychKlasy wyliczenioweHierarchie zapieczętowaneequals, hashCode, toStringPodsumowanie — śledzenie zamówień10Wzorce projektowe, część 2
Delegowanie za pomocą byWzorzec dekoratoraWzorzec budowniczegoWzorzec stanu2Właściwości i hermetyzacja
Własne akcesoryModyfikatory widocznościPrywatne setterylazy i lateinitPowtórka – konto bankowe5Interfejsy
Deklarowanie interfejsówMetody domyślneWiele interfejsówInterfejsy jako typyPowtórzenie – metody płatności8Typy generyczne
Funkcje generyczneKlasy generyczneOgraniczenia typówKowariancja i kontrawariancja: in i outPodsumowanie — kolejka priorytetowa11Projekt: Zarządzanie biblioteką
Książki i czytelnicyWypożyczanie książekPoćwicz samodzielnie: Edytor online Kotlin