Menu
Coddy logo textTech

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 40

Una 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 charging

Cuando 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 photos

Una 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) : Contact

Dentro de main:

val ada = Person("Ada", "ada@example.com")
val named: Named = ada
println(ada.card())
println(named.name)

Salida:

Ada <ada@example.com>
Ada
challenge icon

Desafío

Fácil

Dos 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}")
}
quiz iconPonte a prueba

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

Practica por tu cuenta: Playground de Kotlin