Sekundärkonstruktoren
Teil des Abschnitts Objektorientierte Programmierung der Kotlin-Journey von Coddy. Lektion 5 von 57.
Eine Klasse kann mit sekundären Konstruktoren, die mit constructor deklariert werden, zusätzliche Möglichkeiten zur Erstellung anbieten. Jeder von ihnen muss den primären Konstruktor mit this(...) aufrufen:
class Temperature(val celsius: Double) {
constructor(fahrenheit: Int) : this((fahrenheit - 32) * 5 / 9.0)
}Innerhalb von main:
println(Temperature(20.0).celsius)
println(Temperature(212).celsius)Ausgabe:
20.0
100.0Standardargumente machen sekundäre Konstruktoren oft unnötig. Bevorzuge einen primären Konstruktor mit Standardwerten und verwende einen sekundären Konstruktor, wenn die Eingabe eine andere Form hat, beispielsweise Text, der geparst werden soll:
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)"
}Innerhalb von main:
println(Color(128).label())
println(Color("FF8000").label())Ausgabe:
rgb(128, 128, 128)
rgb(255, 128, 0)Der primäre Konstruktor und seine init-Blöcke werden zuerst ausgeführt, danach der Rumpf des sekundären Konstruktors:
class Log(val name: String) {
init { println("primary: $name") }
constructor(id: Int) : this("log-$id") {
println("secondary: $id")
}
}Innerhalb von main:
Log(7)Ausgabe:
primary: log-7
secondary: 7Konstruktoren müssen mit jeder Überladung eindeutig funktionieren. Zwei Konstruktoren mit denselben Parametertypen sind nicht zulässig, und ein Aufruf, der zu mehreren Konstruktoren passen könnte, wird nicht kompiliert.
class Size(val w: Int, val h: Int) {
constructor(side: Int) : this(side, side) // Size(3) -> ein Quadrat
// constructor(w: Int) : this(w, 1) // Fehler: gleiche Signatur wie oben
}Aufgabe
EinfachVervollständige die Klasse Duration(val seconds: Int) mit einem sekundären Konstruktor (minutes: Int, seconds: Int) und einem weiteren, der Text wie 1:30 oder 2:05:10 (Stunden:Minuten:Sekunden) entgegennimmt. Füge format() hinzu, das h:mm:ss mit zweistelligen Minuten und Sekunden zurückgibt.
Der bereitgestellte Code liest Zeitdauern als Text mit einem oder zwei Doppelpunkten ein, erstellt jede mithilfe des Textkonstruktors und gibt format() aus. Anschließend gibt er total und die formatierte Summe aus.
Dein Code gehört in Duration.kt. Main.kt enthält den bereitgestellten Eingabe-/Ausgabecode und darf nicht bearbeitet werden.
Probier es selbst
fun main() {
// Gelieferter Ein-/Ausgabecode: belasse ihn wie er ist
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())
}
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