Menu
Coddy logo textTech

Costruttori secondari

Fa parte della sezione Programmazione orientata agli oggetti del percorso Kotlin di Coddy. Lezione 5 di 57.

Una classe può offrire modi aggiuntivi per essere creata tramite costruttori secondari, dichiarati con constructor. Ognuno deve chiamare il costruttore primario con this(...):

class Temperature(val celsius: Double) {
    constructor(fahrenheit: Int) : this((fahrenheit - 32) * 5 / 9.0)
}

All'interno di main:

println(Temperature(20.0).celsius)
println(Temperature(212).celsius)

Output:

20.0
100.0

Gli argomenti predefiniti spesso rendono superflui i costruttori secondari. Preferisci un unico costruttore primario con valori predefiniti e usa un costruttore secondario quando l’input ha una forma diversa, ad esempio testo da analizzare:

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

All’interno di main:

println(Color(128).label())
println(Color("FF8000").label())

Output:

rgb(128, 128, 128)
rgb(255, 128, 0)

Il costruttore primario e i suoi blocchi init vengono eseguiti per primi, poi il corpo del costruttore secondario:

class Log(val name: String) {
    init { println("primary: $name") }
    constructor(id: Int) : this("log-$id") {
        println("secondary: $id")
    }
}

All'interno di main:

Log(7)

Output:

primary: log-7
secondary: 7

I costruttori devono funzionare con ogni overload senza ambiguità. Non sono consentiti due costruttori con gli stessi tipi di parametri e una chiamata che potrebbe corrispondere a più costruttori non viene compilata.

class Size(val w: Int, val h: Int) {
    constructor(side: Int) : this(side, side)   // Size(3) -> un quadrato
    // constructor(w: Int) : this(w, 1)        // errore: stessa firma di quello sopra
}
challenge icon

Sfida

Facile

Completa la classe Duration(val seconds: Int) con un costruttore secondario (minutes: Int, seconds: Int) e un altro che accetta testo come 1:30 o 2:05:10 (ore:minuti:secondi). Aggiungi format(), che restituisce h:mm:ss con minuti e secondi a due cifre.

Il codice fornito legge le durate come testo con uno o due due punti, crea ciascuna di esse usando il costruttore che accetta il testo e stampa format(), poi stampa total e la somma formattata.

Il tuo codice va inserito in Duration.kt. Main.kt contiene il codice di input/output fornito e non può essere modificato.

Provalo tu

fun main() {
    // Codice di input/output fornito: lascialo così com'è
    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 iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Playground Kotlin