Menu
Coddy logo textTech

Interfaces multiples

Fait partie de la section Programmation orientée objet du Journey Kotlin de Coddy. Leçon 24 sur 57.

Une classe peut implémenter plusieurs interfaces, séparées par des virgules. Elle doit implémenter les membres de chacune d’elles :

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
}

Dans main :

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

Sortie :

true 40

Une classe peut étendre une classe et implémenter des interfaces dans le même en-tête. Seule la superclasse possède un appel de constructeur :

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

À l’intérieur de main :

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

Sortie :

Pixel is charging

Lorsque deux interfaces fournissent toutes deux un corps par défaut pour la même méthode, la classe doit la redéfinir et décider quoi faire. super<Name>.method() appelle la version d’une interface particulière :

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()
}

À l’intérieur de main :

println(SmartPhone().describe())

Sortie :

makes calls and takes photos

Une interface peut étendre d’autres interfaces. Une classe qui implémente l’interface combinée doit fournir les membres de toutes ces interfaces, et elle est considérée comme chacune d’elles :

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

Dans main :

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

Sortie :

Ada <ada@example.com>
Ada
challenge icon

Défi

Facile

Deux interfaces décrivent un appareil intelligent : Switchable exige isOn (un Boolean en lecture seule pour les appelants) et toggle(), tandis que Dimmable exige un brightness modifiable. Faites implémenter les deux interfaces par SmartLamp : il démarre éteint avec une luminosité de 100, toggle() l’allume et l’éteint alternativement, une luminosité en dehors de l’intervalle de 0 à 100 est limitée par le setter, et status() renvoie on 70% ou off.

Le code fourni lit des commandes toggle ou un nombre représentant la luminosité, les applique à une lampe et affiche status() après chacune d’elles, puis vérifie que la lampe est Switchable et Dimmable.

Votre code doit se trouver dans Switchable.kt, Dimmable.kt et SmartLamp.kt. Main.kt contient le code d’entrée/sortie fourni et ne peut pas être modifié.

Essayez vous-même

fun main() {
    // Code d'entrée/sortie fourni : le garder tel quel
    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 iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Programmation orientée objet

Entraînez-vous par vous-même : Playground Kotlin