interface
| 対応: | Kotlin 1.0(2016) |
|---|
Kotlinの『interface』は、クラスが実装すべきメソッドとプロパティの契約を定義します。デフォルト実装を持てる点がJavaと同様です。複数のインターフェースを実装でき、多重継承の問題を回避した設計ができます。
構文
// インターフェースの定義
interface Drawable {
fun draw() // 抽象メソッド(実装必須)
fun clear() = println("クリアします") // デフォルト実装
val color: String // 抽象プロパティ
}
// インターフェースの実装
class Circle(override val color: String) : Drawable {
override fun draw() = println("$color の円を描画します")
}
// 複数インターフェースの実装
class Button : Drawable, Clickable {
override val color = "青"
override fun draw() = println("ボタンを描画します")
override fun onClick() = println("クリックされました")
}
構文一覧
| 構文 | 概要 |
|---|---|
| interface 名前 { } | インターフェースを定義します。 |
| fun メソッド名() | 抽象メソッドです(実装クラスで override が必須)。 |
| fun メソッド名() = 処理 | デフォルト実装のメソッドです(override 可能)。 |
| val プロパティ名: 型 | 抽象プロパティです(実装クラスで override が必須)。 |
| クラス名 : インターフェース名 | インターフェースを実装します。 |
| super<インターフェース名>.メソッド() | 複数インターフェースのデフォルト実装を明示的に呼び出します。 |
サンプルコード
sample_interface_kotlin.kt
// インターフェースの定義
interface Fighter {
val name: String
fun style(): String
fun introduce() = println("私は ${name} です。${style()} を使います。")
}
interface KofPlayer {
fun fight() = println("試合開始!")
fun taunt() = println("月を見るたび思い出せ!")
}
// 複数インターフェースを実装します。
class KofFighter(override val name: String) : Fighter, KofPlayer {
override fun style() = "八神流古武術"
override fun fight() {
super.fight() // デフォルト実装を呼び出します。
println(" すぐ楽にしてやる...。")
}
}
class SnkFighter(override val name: String) : Fighter, KofPlayer {
override fun style() = "草薙流古武術"
}
// デフォルト実装の競合解決
interface A {
fun hello() = println("A の挨拶")
}
interface B {
fun hello() = println("B の挨拶")
}
class C : A, B {
// 両方がデフォルト実装を持つ場合、明示的に選択が必要です。
override fun hello() {
super<A>.hello()
super<B>.hello()
println("C の追加処理")
}
}
fun main() {
val iori = KofFighter("八神庵")
iori.introduce() // Fighter のデフォルト実装
iori.fight() // override したメソッド
iori.taunt() // KofPlayer のデフォルト実装
println()
val kyo = SnkFighter("草薙京")
kyo.introduce()
println()
// インターフェース型で扱います。
val fighters: List<Fighter> = listOf(KofFighter("暴走庵"), SnkFighter("裏京"))
fighters.forEach { it.introduce() }
println()
// デフォルト実装の競合解決
C().hello()
}
kotlinc interface_kotlin.kt -include-runtime -d interface_kotlin.jar java -jar interface_kotlin.jar 私は 八神庵 です。八神流古武術 を使います。 試合開始! すぐ楽にしてやる...。 月を見るたび思い出せ! 私は 草薙京 です。草薙流古武術 を使います。 私は 暴走庵 です。八神流古武術 を使います。 私は 裏京 です。草薙流古武術 を使います。 A の挨拶 B の挨拶 C の追加処理
概要
Kotlinのインターフェースはデフォルト実装を持てるため、Java 8のインターフェースと同様の機能があります。ただし、インターフェースは状態(フィールドの値)を持てず、プロパティはgetterを通じた計算値か実装クラスに委譲します。
2つのインターフェースが同名のデフォルト実装を持つ場合、実装クラスで明示的に『super<インターフェース名>.メソッド()』を使って選択する必要があります。
継承との使い分けはopen / overrideを、シングルトンパターンはobject / companion objectを参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。