Kotlinオブジェクト向けインタフェース(Interfaces)

1805 ワード

KotlinのインタフェースはJava 8によく似ています.抽象メソッドと抽象メソッドの実装を含むことができます.抽象クラスとは異なり、インタフェースがステータスを格納できない点です.プロパティは持つことができますが、抽象的として宣言するか、アクセサの実装を提供する必要があります.
インタフェースの定義には、interfaceのキーワードが必要です.
interface MyInterface {
    fun bar()
    fun foo() {
      // optional body
    }
}

インタフェースの実装(Implementing Interfaces)
                 :

class Child : MyInterface {
    override fun bar() {
        // body
    }
}

インタフェースのプロパティ(Properties in Interfaces)
インタフェースで属性を宣言できます.インタフェースで宣言されるプロパティは抽象的であってもよいし、アクセサに実装を提供してもよい.インタフェースで宣言されたプロパティにはバックアップフィールドは使用できません.したがって、インタフェースで宣言されたアクセサはバックアップフィールドを参照できません.
interface MyInterface {
    val prop: Int // abstract

    val propertyWithImplementation: String
        get() = "foo"

    fun foo() {
        print(prop)
    }
}

class Child : MyInterface {
    override val prop: Int = 29
}

リロード競合の解決(Resolving overriding conflicts)
ベースクラスのリスト(継承または実装する)に複数のベースクラス(親またはインタフェース)が存在する場合、同じメソッドの複数の実装を継承する場合があります.例:
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にabstractと表記されていないが,インタフェースのメソッドはメソッド体がなければabstractがデフォルトである).ここで,Aから特定のクラスCを導出すると,bar()を書き換え,実装を提供する必要があることは明らかである.
しかし、AとBからDをエクスポートする場合は、複数のインタフェースから継承されたすべての方法を実装し、Dがどのように実装されるべきかを指定する必要があります.このルールは、単一のインプリメンテーション(bar()および複数のインプリメンテーション(foo())を継承する方法に適用されます.