Construtores Secundários
Parte da seção Programação Orientada a Objetos do Journey de Kotlin da Coddy. Lição 5 de 57.
Uma classe pode oferecer formas adicionais de ser criada com construtores secundários, declarados com constructor. Cada um deve chamar o construtor primário com 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)Saída:
20.0
100.0Argumentos padrão geralmente tornam construtores secundários desnecessários. Prefira um construtor primário com valores padrão e use um construtor secundário quando a entrada tiver um formato diferente, como texto para analisar:
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())Saída:
rgb(128, 128, 128)
rgb(255, 128, 0)O construtor primário e seus blocos init são executados primeiro, depois o corpo do construtor secundário:
class Log(val name: String) {
init { println("primary: $name") }
constructor(id: Int) : this("log-$id") {
println("secondary: $id")
}
}Dentro de main:
Log(7)Saída:
primary: log-7
secondary: 7Os construtores devem funcionar com cada sobrecarga de forma inequívoca. Não são permitidos dois construtores com os mesmos tipos de parâmetros, e uma chamada que possa corresponder a vários construtores não é compilada.
class Size(val w: Int, val h: Int) {
constructor(side: Int) : this(side, side) // Size(3) -> um quadrado
// constructor(w: Int) : this(w, 1) // error: mesma assinatura que acima
}Desafio
FácilComplete a classe Duration(val seconds: Int) com um construtor secundário (minutes: Int, seconds: Int) e outro que aceite texto como 1:30 ou 2:05:10 (horas:minutos:segundos). Adicione format(), que retorna h:mm:ss com minutos e segundos de dois dígitos.
O código fornecido lê durações como texto com um ou dois sinais de dois-pontos, cria cada uma usando o construtor de texto e imprime format(); em seguida, imprime total e a soma formatada.
Seu código deve estar em Duration.kt. Main.kt contém o código fornecido de entrada/saída e não pode ser editado.
Experimente você mesmo
fun main() {
// Código de entrada/saída fornecido: mantenha-o 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 lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Programação Orientada a Objetos
1Classes e Objetos
Trabalhando com ArquivosDefinindo ClassesConstrutores PrimáriosBlocos init e ValidaçãoConstrutores SecundáriosRecapitulação - Cartão da Biblioteca4Herança
Classes Abertas e SubclassesSobrescrevendo Membrossuper e ConstrutoresClasses AbstratasRevisão - Diretório de Funcionários2Propriedades e Encapsulamento
Acessores PersonalizadosModificadores de VisibilidadeSetters Privadoslazy e lateinitRevisão - Conta Bancária5Interfaces
Declarando InterfacesMétodos PadrãoMúltiplas InterfacesInterfaces como TiposRecapitulação - Métodos de Pagamento8Genéricos
Funções genéricasClasses genéricasRestrições de tipoVariância com in e outRecapitulação - Fila de prioridade11Projeto: Gerenciamento de Biblioteca
Livros e MembrosEmpréstimo de LivrosPratique por conta própria: Playground de Kotlin