Constructores secundarios
Parte de la sección Programación orientada a objetos del Journey de Kotlin de Coddy. Lección 5 de 57.
Una clase puede ofrecer formas adicionales de crearse mediante constructores secundarios, declarados con constructor. Cada uno debe llamar al constructor primario con this(...):
class Temperature(val celsius: Double) {
constructor(fahrenheit: Int) : this((fahrenheit - 32) * 5 / 9.0)
}Dentro de main:
println(Temperature(20.0).celsius)
println(Temperature(212).celsius)Salida:
20.0
100.0Los argumentos predeterminados a menudo hacen innecesarios los constructores secundarios. Prefiere un constructor primario con valores predeterminados y usa un constructor secundario cuando la entrada tenga una forma diferente, como texto para analizar:
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)"
}Dentro de main:
println(Color(128).label())
println(Color("FF8000").label())Salida:
rgb(128, 128, 128)
rgb(255, 128, 0)El constructor primario y sus bloques init se ejecutan primero, después el cuerpo del constructor secundario:
class Log(val name: String) {
init { println("primary: $name") }
constructor(id: Int) : this("log-$id") {
println("secondary: $id")
}
}Dentro de main:
Log(7)Salida:
primary: log-7
secondary: 7Los constructores deben funcionar con cada sobrecarga sin ambigüedad. No se permiten dos constructores con los mismos tipos de parámetros, y una llamada que podría coincidir con varios constructores no se compila.
class Size(val w: Int, val h: Int) {
constructor(side: Int) : this(side, side) // Size(3) -> un cuadrado
// constructor(w: Int) : this(w, 1) // error: misma firma que la de arriba
}Desafío
FácilCompleta la clase Duration(val seconds: Int) con un constructor secundario (minutes: Int, seconds: Int) y otro que acepte texto como 1:30 o 2:05:10 (horas:minutos:segundos). Añade format(), que devuelva h:mm:ss con minutos y segundos de dos dígitos.
El código proporcionado lee las duraciones como texto con uno o dos dos puntos, crea cada una con el constructor de texto e imprime format(); después imprime total y la suma formateada.
Tu código va en Duration.kt. Main.kt contiene el código proporcionado de entrada/salida y no se puede editar.
Pruébalo tú mismo
fun main() {
// Código de entrada/salida suministrado: déjalo como está
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())
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Programación orientada a objetos
1Clases y objetos
Trabajar con archivosDefinir clasesConstructores primariosBloques init y validaciónConstructores secundariosRepaso - Tarjeta de biblioteca4Herencia
Clases abiertas y subclasesSobrescritura de miembrossuper y constructoresClases abstractasRepaso: directorio del personal2Propiedades y encapsulación
Accesores personalizadosModificadores de visibilidadSetters privadoslazy y lateinitRepaso: cuenta bancaria5Interfaces
Declaración de interfacesMétodos predeterminadosInterfaces múltiplesInterfaces como tiposRepaso: métodos de pago8Genéricos
Funciones genéricasClases genéricasRestricciones de tiposVariancia con in y outRepaso - Cola de prioridad11Proyecto: Gestión de biblioteca
Libros y miembrosPréstamo de librosPractica por tu cuenta: Playground de Kotlin