Kotlinオブジェクト向けインタフェース(Interfaces)
1805 ワード
KotlinのインタフェースはJava 8によく似ています.抽象メソッドと抽象メソッドの実装を含むことができます.抽象クラスとは異なり、インタフェースがステータスを格納できない点です.プロパティは持つことができますが、抽象的として宣言するか、アクセサの実装を提供する必要があります.
インタフェースの定義には、
インタフェースの実装(Implementing Interfaces)
インタフェースのプロパティ(Properties in Interfaces)
インタフェースで属性を宣言できます.インタフェースで宣言されるプロパティは抽象的であってもよいし、アクセサに実装を提供してもよい.インタフェースで宣言されたプロパティにはバックアップフィールドは使用できません.したがって、インタフェースで宣言されたアクセサはバックアップフィールドを参照できません.
リロード競合の解決(Resolving overriding conflicts)
ベースクラスのリスト(継承または実装する)に複数のベースクラス(親またはインタフェース)が存在する場合、同じメソッドの複数の実装を継承する場合があります.例:
インタフェースAおよびBは、関数foo()およびbar()を宣言する.彼らはfoo()を実現したが,Bのみbar()を実現した(bar()はAにabstractと表記されていないが,インタフェースのメソッドはメソッド体がなければabstractがデフォルトである).ここで,Aから特定のクラスCを導出すると,bar()を書き換え,実装を提供する必要があることは明らかである.
しかし、AとBからDをエクスポートする場合は、複数のインタフェースから継承されたすべての方法を実装し、Dがどのように実装されるべきかを指定する必要があります.このルールは、単一のインプリメンテーション(bar()および複数のインプリメンテーション(foo())を継承する方法に適用されます.
インタフェースの定義には、
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())を継承する方法に適用されます.