Konstruktory dodatkowe
Część sekcji Programowanie obiektowe ścieżki Kotlin w Coddy. Lekcja 5 z 57.
Klasa może oferować dodatkowe sposoby tworzenia obiektów za pomocą konstruktorów drugorzędnych, deklarowanych przy użyciu constructor. Każdy z nich musi wywoływać konstruktor podstawowy za pomocą this(...):
class Temperature(val celsius: Double) {
constructor(fahrenheit: Int) : this((fahrenheit - 32) * 5 / 9.0)
}Wewnątrz main:
println(Temperature(20.0).celsius)
println(Temperature(212).celsius)Wynik:
20.0
100.0Argumenty domyślne często sprawiają, że konstruktory dodatkowe są zbędne. Preferuj jeden konstruktor główny z wartościami domyślnymi, a konstruktora dodatkowego używaj, gdy dane wejściowe mają inny format, na przykład tekst do sparsowania:
class Color(val r: Int, val g: Int, val b: Int) {
constructor(gray: Int) : this(gray, gray, gray)
constructor(hex: String) : this(hex.substring(0, 2).toInt(16), hex.substring(2, 4).toInt(16), hex.substring(4, 6).toInt(16))
fun label() = "rgb($r, $g, $b)"
}Wewnątrz main:
println(Color(128).label())
println(Color("FF8000").label())Wynik:
rgb(128, 128, 128)
rgb(255, 128, 0)Najpierw uruchamiany jest konstruktor główny wraz z blokami init, a następnie treść konstruktora dodatkowego:
class Log(val name: String) {
init { println("primary: $name") }
constructor(id: Int) : this("log-$id") {
println("secondary: $id")
}
}Wewnątrz main:
Log(7)Wynik:
primary: log-7
secondary: 7Konstruktory muszą działać jednoznacznie dla każdego przeciążenia. Niedozwolone są dwa konstruktory o tych samych typach parametrów, a wywołanie, które mogłoby pasować do kilku konstruktorów, nie zostanie skompilowane.
class Size(val w: Int, val h: Int) {
constructor(side: Int) : this(side, side) // Size(3) -> kwadrat
// constructor(w: Int) : this(w, 1) // błąd: taka sama sygnatura jak powyżej
}Wyzwanie
ŁatwyUzupełnij klasę Duration(val seconds: Int), dodając konstruktor dodatkowy (minutes: Int, seconds: Int) oraz kolejny, który przyjmuje tekst, taki jak 1:30 lub 2:05:10 (godziny:minuty:sekundy). Dodaj format(), która zwraca wartość w formacie h:mm:ss, z minutami i sekundami zapisanymi za pomocą dwóch cyfr.
Dostarczony kod odczytuje czasy trwania jako tekst zawierający jeden lub dwa dwukropki, tworzy każdy obiekt za pomocą konstruktora przyjmującego tekst i wyświetla format(), a następnie wyświetla total i sformatowaną sumę.
Umieść swój kod w pliku Duration.kt. Plik 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()
var total = 0
for (line in input) {
val d = Duration(line)
println(d.format())
total += d.seconds
}
println("total " + Duration(total).format())
}
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