Múltiplas Interfaces
Parte da seção Programação Orientada a Objetos do Journey de Kotlin da Coddy. Lição 24 de 57.
Uma classe pode implementar várias interfaces, separadas por vírgulas. Ela precisa implementar os membros de todas elas:
interface Switchable {
var isOn: Boolean
fun toggle() { isOn = !isOn }
}
interface Dimmable {
var level: Int
}
class Lamp : Switchable, Dimmable {
override var isOn = false
override var level = 100
}Dentro de main:
val lamp = Lamp()
lamp.toggle()
lamp.level = 40
println("${lamp.isOn} ${lamp.level}")Saída:
true 40Uma classe pode estender uma classe e implementar interfaces no mesmo cabeçalho. Apenas a superclasse tem uma chamada de construtor:
open class Device(val name: String)
interface Rechargeable {
fun charge(): String
}
class Phone(name: String) : Device(name), Rechargeable {
override fun charge() = "$name is charging"
}Dentro de main:
println(Phone("Pixel").charge())Saída:
Pixel is chargingQuando duas interfaces fornecem um corpo padrão para o mesmo método, a classe deve substituí-lo e decidir o que fazer. super<Name>.method() chama a versão de uma interface específica:
interface Camera {
fun describe() = "takes photos"
}
interface Telephone {
fun describe() = "makes calls"
}
class SmartPhone : Camera, Telephone {
override fun describe() = super<Telephone>.describe() + " and " + super<Camera>.describe()
}Dentro de main:
println(SmartPhone().describe())Saída:
makes calls and takes photosUma interface pode estender outras interfaces. Uma classe que implementa a interface combinada deve fornecer os membros de todas elas e é considerada cada uma delas:
interface Named {
val name: String
}
interface Contact : Named {
val email: String
fun card() = "$name <$email>"
}
class Person(override val name: String, override val email: String) : ContactDentro de main:
val ada = Person("Ada", "ada@example.com")
val named: Named = ada
println(ada.card())
println(named.name)Saída:
Ada <ada@example.com>
AdaDesafio
FácilDuas interfaces descrevem um dispositivo inteligente: Switchable exige isOn (um Boolean somente para leitura para quem chama) e toggle(), e Dimmable exige um brightness gravável. Faça SmartLamp implementar ambas: ela começa desligada com brilho 100, toggle() a alterna entre ligada e desligada, um brilho fora do intervalo de 0 a 100 é limitado pelo setter, e status() retorna on 70% ou off.
O código fornecido lê comandos toggle ou um número de brilho, aplica-os a uma lâmpada e imprime status() após cada um; em seguida, verifica se a lâmpada é Switchable e Dimmable.
Seu código deve ser colocado em Switchable.kt, Dimmable.kt e SmartLamp.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()
val lamp = SmartLamp()
for (cmd in input) {
if (cmd == "toggle") lamp.toggle() else lamp.brightness = cmd.toInt()
println(lamp.status())
}
println("switchable: ${(lamp as Any) is Switchable}, dimmable: ${(lamp as Any) is Dimmable}")
}
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