Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
interface
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<インターフェース名>.メソッド() | 複数インターフェースのデフォルト実装を明示的に呼び出します。 |
サンプルコード
// インターフェースの定義
interface Animal {
val name: String
fun sound(): String
fun introduce() = println("私は ${name} です。${sound()} と鳴きます。")
}
interface Pet {
fun play() = println("遊んでいます!")
fun groom() = println("グルーミング中です...")
}
// 複数インターフェースを実装します。
class Dog(override val name: String) : Animal, Pet {
override fun sound() = "ワン"
override fun play() {
super.play() // デフォルト実装を呼び出します。
println(" フェッチして遊びます!")
}
}
class Cat(override val name: String) : Animal, Pet {
override fun sound() = "ニャー"
}
// デフォルト実装の競合解決
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 dog = Dog("ポチ")
dog.introduce() // Animal のデフォルト実装
dog.play() // override したメソッド
dog.groom() // Pet のデフォルト実装
println()
val cat = Cat("タマ")
cat.introduce()
println()
// インターフェース型で扱います。
val animals: List<Animal> = listOf(Dog("ハチ"), Cat("ミケ"))
animals.forEach { it.introduce() }
println()
// デフォルト実装の競合解決
C().hello()
}
概要
Kotlinのインターフェースはデフォルト実装を持てるため、Java 8のインターフェースと同様の機能があります。ただし、インターフェースは状態(フィールドの値)を持てず、プロパティはgetterを通じた計算値か実装クラスに委譲します。
2つのインターフェースが同名のデフォルト実装を持つ場合、実装クラスで明示的に『super<インターフェース名>.メソッド()』を使って選択する必要があります。
継承との使い分けはopen / overrideを、シングルトンパターンはobject / companion objectを参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。