Interfaces múltiples
Parte de la sección Programación orientada a objetos del Journey de Kotlin de Coddy. Lección 24 de 57.
Una clase puede implementar varias interfaces, separadas por comas. Tiene que implementar los miembros de todas ellas:
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}")Salida:
true 40Una clase puede extender una clase e implementar interfaces en el mismo encabezado. Solo la superclase tiene una llamada al constructor:
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())Salida:
Pixel is chargingCuando dos interfaces proporcionan un cuerpo predeterminado para el mismo método, la clase debe sobrescribirlo y decidir qué hacer. super<Name>.method() llama a la versión de una interfaz concreta:
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())Salida:
makes calls and takes photosUna interfaz puede extender otras interfaces. Una clase que implementa la interfaz combinada debe proporcionar los miembros de todas ellas y cuenta como cada una de ellas:
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)Salida:
Ada <ada@example.com>
AdaDesafío
FácilDos interfaces describen un dispositivo inteligente: Switchable requiere isOn (un Boolean de solo lectura para quienes llaman) y toggle(), y Dimmable requiere un brightness modificable. Haz que SmartLamp implemente ambas: comienza apagada con un brillo de 100, toggle() alterna entre encendida y apagada, un brillo fuera del rango de 0 a 100 se limita mediante el establecedor, y status() devuelve on 70% o off.
El código proporcionado lee comandos toggle o un número de brillo, los aplica a una lámpara e imprime status() después de cada uno; después comprueba que la lámpara sea Switchable y Dimmable.
Tu código debe estar en Switchable.kt, Dimmable.kt y SmartLamp.kt. Main.kt contiene el código de entrada/salida proporcionado y no se puede editar.
Pruébalo tú mismo
fun main() {
// Código de entrada/salida suministrado: déjalo tal 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 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