Menu
Coddy logo textTech

Constructeurs secondaires

Fait partie de la section Programmation orientée objet du Journey Kotlin de Coddy. Leçon 5 sur 57.

Une classe peut proposer des façons supplémentaires d’être créée avec des constructeurs secondaires, déclarés avec constructor. Chacun doit appeler le constructeur primaire avec this(...) :

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

Dans main :

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

Sortie :

20.0
100.0

Les arguments par défaut rendent souvent les constructeurs secondaires inutiles. Préfère un constructeur principal avec des valeurs par défaut, et utilise un constructeur secondaire lorsque l’entrée a une forme différente, par exemple du texte à analyser :

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

Dans main :

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

Sortie :

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

Le constructeur primaire et ses blocs init s’exécutent en premier, puis le corps du constructeur secondaire :

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

Dans main :

Log(7)

Sortie :

primary: log-7
secondary: 7

Les constructeurs doivent fonctionner avec chaque surcharge sans ambiguïté. Deux constructeurs ayant les mêmes types de paramètres ne sont pas autorisés, et un appel qui pourrait correspondre à plusieurs constructeurs ne compile pas.

class Size(val w: Int, val h: Int) {
    constructor(side: Int) : this(side, side)   // Size(3) -> un carré
    // constructor(w: Int) : this(w, 1)        // erreur : même signature que ci-dessus
}
challenge icon

Défi

Facile

Complétez la classe Duration(val seconds: Int) avec un constructeur secondaire (minutes: Int, seconds: Int) et un autre qui accepte du texte comme 1:30 ou 2:05:10 (heures:minutes:secondes). Ajoutez format(), qui renvoie h:mm:ss avec des minutes et des secondes sur deux chiffres.

Le code fourni lit les durées sous forme de texte avec un ou deux deux-points, crée chacune d’elles avec le constructeur prenant du texte et affiche format(), puis affiche total suivi de la somme formatée.

Votre code doit se trouver dans Duration.kt. Main.kt contient le code d’entrée/sortie fourni et ne peut pas être modifié.

Essayez vous-même

fun main() {
    // Code d'entrée/sortie fourni : le garder tel quel
    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 iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Programmation orientée objet

Entraînez-vous par vous-même : Playground Kotlin