Kotlinインターフェース
KotlinインターフェースはJava8に似ています。interfaceキーワードはインターフェースを定義するために使用され、メソッドにデフォルトの実装を持たせることができます。
interface MyInterface {
fun bar() // 未实现
fun foo() { //已实现
// 可选的方法体
println("foo")
}
}
インターフェイスを実装する
クラスまたはオブジェクトは、1つ以上のインターフェースを実装できます
class Child : MyInterface {
override fun bar() {
// 方法体
}
}
インスタンス
interface MyInterface {
fun bar()
fun foo() {
// 可选的方法体
println("foo")
}
}
class Child : MyInterface {
override fun bar() {
// 方法体
println("bar")
}
}
fun main(args: Array<String>) {
val c = Child()
c.foo();
c.bar();
}
出力結果
foo
bar
インターフェイスの属性
インターフェイスの属性は抽象のみであり、初期化値は許可されていません。インターフェイスは属性値を保存しません。インターフェイスを実装するときは、属性を書き換える必要があります。
interface MyInterface{
var name:String //name 属性, 抽象的
}
class MyImpl:MyInterface{
override var name: String = "runoob" //重写属性
}
インスタンス
interface MyInterface {
var name:String //name 属性, 抽象的
fun bar()
fun foo() {
// 可选的方法体
println("foo")
}
}
class Child : MyInterface {
override var name: String = "runoob" //重写属性
override fun bar() {
// 方法体
println("bar")
}
}
fun main(args: Array<String>) {
val c = Child()
c.foo();
c.bar();
println(c.name)
}
出力結果
foo
bar
runoob
関数の書き換え
複数のインターフェースを実装する場合、同じメソッドの複数の実装を継承するという問題が発生する可能性があります。例えば
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<A>.foo()
super<B>.foo()
}
override fun bar() {
super<B>.bar()
}
}
fun main(args: Array<String>) {
val d = D()
d.foo();
d.bar();
}
出力結果は次のとおりです。
ABbar
この例では、インターフェースAとBの両方がメソッドfoo()とbar()を定義しており、どちらもfoo()を実装し、Bはbar()を実装しています。CはAを実装する具象クラスであるため、bar()を書き直して、この抽象メソッドを実装する必要があります。
ただし、AとBからDを導出する場合は、複数のインターフェイスによって継承されるすべてのメソッドを実装し、Dがそれらを実装する方法を指定する必要があります。このルールは、単一の実装から継承するメソッド(bar())と複数の実装から継承するメソッド(foo())の両方に適用されます。