Menu
Coddy logo textTech

複数のインターフェース

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

クラスは、同じヘッダーで1つのクラスを拡張し、インターフェースを実装できます。コンストラクター呼び出しを持つのはスーパークラスだけです:

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

2つのインターフェースが同じメソッドにデフォルトの本体を提供する場合、クラスはそれをオーバーライドして、何をするか決める必要があります。super<Name>.method()は、特定の1つのインターフェースのバージョンを呼び出します。

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

チャレンジ

簡単

2つのインターフェースがスマートデバイスを記述します。SwitchableはisOn(呼び出し側からは読み取り専用のBoolean)とtoggle()を要求し、Dimmableは書き込み可能なbrightnessを要求します。SmartLampに両方を実装させてください。初期状態では消灯しており、明るさは100です。toggle()は点灯と消灯を切り替え、0から100の範囲外の明るさはセッターによって範囲内に収められ、status()はon 70%またはoffを返します。

提供されたコードは、toggleまたは明るさを表す数値のコマンドを読み取り、それらを1つのランプに適用して、各コマンドの後に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プレイグラウンド