Menu
Coddy logo textTech

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.0

Standardargumente 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: 7

Konstruktoren 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
}
challenge icon

Aufgabe

Einfach

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