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.0Gli 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: 7I 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
}Sfida
FacileCompleta 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())
}
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
1Classi e oggetti
Lavorare con i fileDefinire le classiCostruttori primariBlocchi init e convalidaCostruttori secondariRiepilogo - Tessera della biblioteca4Ereditarietà
Classi aperte e sottoclassiRidefinizione dei membrisuper e costruttoriClassi astratteRiepilogo - Elenco del personale2Proprietà e incapsulamento
Accessor personalizzatiModificatori di visibilitàSetter privatilazy e lateinitRipasso - Conto bancario5Interfacce
Dichiarare le interfacceMetodi predefinitiInterfacce multipleLe interfacce come tipiRiepilogo - Metodi di pagamento8Tipi generici
Funzioni genericheClassi genericheVincoli sui tipiVarianza con in e outRiepilogo - Coda con priorità11Progetto: Gestione della biblioteca
Libri e sociPrendere in prestito i libriEsercitati da solo: Playground Kotlin