複数のインターフェース
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 charging2つのインターフェースが同じメソッドにデフォルトの本体を提供する場合、クラスはそれをオーバーライドして、何をするか決める必要があります。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) : Contactmainの内部で:
val ada = Person("Ada", "ada@example.com")
val named: Named = ada
println(ada.card())
println(named.name)出力:
Ada <ada@example.com>
Adaチャレンジ
簡単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}")
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: Kotlinプレイグラウンド