Menu
Coddy logo textTech

Interfacce multiple

Fa parte della sezione Programmazione orientata agli oggetti del percorso Kotlin di Coddy. Lezione 24 di 57.

Una classe può implementare diverse interfacce, separate da virgole. Deve implementare i membri di tutte:

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
}

All'interno di main:

val lamp = Lamp()
lamp.toggle()
lamp.level = 40
println("${lamp.isOn} ${lamp.level}")

Output:

true 40

Una classe può estendere una classe e implementare interfacce nella stessa intestazione. Solo la superclasse ha una chiamata al costruttore:

open class Device(val name: String)
interface Rechargeable {
    fun charge(): String
}
class Phone(name: String) : Device(name), Rechargeable {
    override fun charge() = "$name is charging"
}

All'interno di main:

println(Phone("Pixel").charge())

Output:

Pixel is charging

Quando due interfacce forniscono entrambe un corpo predefinito per lo stesso metodo, la classe deve sovrascriverlo e decidere cosa fare. super<Name>.method() chiama la versione di una specifica interfaccia:

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 main:

println(SmartPhone().describe())

Output:

makes calls and takes photos

Un'interfaccia può estendere altre interfacce. Una classe che implementa l'interfaccia combinata deve fornire i membri di tutte e conta come ciascuna di esse:

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 main:

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

Output:

Ada <ada@example.com>
Ada
challenge icon

Sfida

Facile

Due interfacce descrivono un dispositivo intelligente: Switchable richiede isOn (un Boolean di sola lettura per chi lo usa) e toggle(), mentre Dimmable richiede un brightness scrivibile. Fai implementare entrambe a SmartLamp: parte spenta con luminosità 100, toggle() la accende e la spegne, un valore di luminosità inferiore a 0 o superiore a 100 viene limitato dal setter e status() restituisce on 70% oppure off.

Il codice fornito legge i comandi toggle o un numero che indica la luminosità, li applica a una lampada e stampa status() dopo ciascun comando, quindi verifica che la lampada sia Switchable e Dimmable.

Il tuo codice va inserito in Switchable.kt, Dimmable.kt e SmartLamp.kt. Main.kt contiene il codice di input/output fornito e non può essere modificato.

Provalo tu

fun main() {
    // Codice di input/output fornito: lascialo così com'è
    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 iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Playground Kotlin