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.0Les 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: 7Les 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
}Défi
FacileComplé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())
}
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
1Classes et objets
Travailler avec des fichiersDéfinir des classesConstructeurs primairesBlocs init et validationConstructeurs secondairesRécapitulatif - Carte de bibliothèque4Héritage
Classes ouvertes et sous-classesRedéfinition des membressuper et constructeursClasses abstraitesRécapitulatif – Annuaire du personnel2Propriétés et encapsulation
Accesseurs personnalisésModificateurs de visibilitéSetters privéslazy et lateinitRécapitulatif - Compte bancaire5Interfaces
Déclarer des interfacesMéthodes par défautInterfaces multiplesInterfaces en tant que typesRécapitulatif - Méthodes de paiement8Génériques
Fonctions génériquesClasses génériquesContraintes de typeVariance avec in et outRécapitulatif - File de priorité11Projet : Gestion de bibliothèque
Livres et membresEmprunter des livresEntraînez-vous par vous-même : Playground Kotlin