Kotlinクラスとオブジェクト編(3)--インタフェース
1734 ワード
Kotlin
転載出典二先輩kotlinを明記してくださいKotlinのインタフェースはjava 8に似ています.抽象的な方法と方法の実装を含むことができます.抽象クラスとは異なり、インタフェースはステータスを保存できません.プロパティはありますが、抽象的でなければなりません.または、アクセサの実装を提供します.
インタフェースは、キーワード
interface
によって定義される.interface MyInterface {
fun bar()
fun foo() {
// optional body
}
}
実装インタフェース
1つのクラスまたはオブジェクトは、1つ以上のインタフェースを実装できます.
class Child : MyInterface {
override fun bar() {
// body
}
}
インタフェースのプロパティ
インタフェースにプロパティを明記できます.インタフェースのプロパティは抽象的か、アクセサの実装を提供します.インタフェースのプロパティは、隠しドメイン(backing field)を持つことはできません.したがって、アクセサはそれらを参照することはできません.
interface MyInterface {
val prop: Int // abstract
val propertyWithImplementation: String
get() = "foo"
fun foo() {
print(prop)
}
}
class Child : MyInterface {
override val prop: Int = 29
}
書き換えの競合の解決
親クラスで多くのタイプを宣言すると、メソッドの多くの実装が発生する可能性があります.例:
interface A {
fun foo() { print("A") }
fun bar()
}
interface B {
fun foo() { print("B") }
fun bar() { print("bar") }
}
class C : A {
override fun bar() { print("bar") }
}
class D : A, B {
override fun foo() {
super.foo()
super.foo()
}
override fun bar() {
super.bar()
}
}
A Bインタフェースにはfoo()とbar()関数が宣言されています.これらはfoo()メソッドを実装しているが,Bのみがbar()を実装しており,bar()はインタフェースに関数体がなければデフォルトで抽出されるため,Aで抽象的であると宣言していない.
しかし、AからCエンティティクラスを派生させる場合は、bar()を書き換え、実装する必要があることは明らかです.私たちはAとBからDを派生して、bar()方法を書き換える必要はありません.私たちの継承の中にそれを実現したものがあるからです.しかし、私たちは2つのfoo()の実装を継承しているので、コンパイラはどれを選ぶべきか分からず、foo()を書き換えるように強制し、どのように実装したいかを明確に指摘しています.