Menu
CoddyTech

多个接口

本课属于 Coddy Kotlin 学习旅程的“面向对象编程”单元。第 24 课,共 57 课。

一个类可以实现多个接口,接口之间用逗号分隔。它必须实现所有接口的成员:

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
}

在 main 中:

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

输出:

true 40

一个类可以在同一个类头中继承一个类并实现多个接口。只有超类需要调用构造函数:

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

在 main 中:

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

输出:

Pixel is charging

如果两个接口都为同一个方法提供了默认方法体,类就必须重写它并决定如何处理。super<Name>.method() 会调用某个特定接口的版本:

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

在 main 中:

println(SmartPhone().describe())

输出:

makes calls and takes photos

接口可以继承其他接口。实现组合接口的类必须提供所有接口的成员,并且它也属于每个接口:

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

在 main 中:

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

输出:

Ada <ada@example.com>
Ada
challenge icon

挑战

简单

两个接口描述了一个智能设备:Switchable 要求提供 isOn(供调用者读取的只读 Boolean)和 toggle(),Dimmable 要求提供可写的 brightness。让 SmartLamp 实现这两个接口:它初始为关闭状态,亮度为 100;toggle() 会切换开关状态;亮度超出 0 到 100 时,setter 会将其限制在此范围内;status() 返回 on 70% 或 off。

提供的代码会读取 toggle 命令或亮度数值,将其应用到一盏灯上,并在每次操作后打印 status(),然后检查这盏灯是否实现了 Switchable 和 Dimmable。

你的代码写在 Switchable.kt、Dimmable.kt 和 SmartLamp.kt 中。Main.kt 包含提供的输入输出代码,不能编辑。

亲手试试

fun main() {
    // 提供的输入/输出代码:保持原样
    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 icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

面向对象编程中的所有课

自己练习: Kotlin 在线编辑器