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()を書き換えるように強制し、どのように実装したいかを明確に指摘しています.