Kotlin 接口

Chiclaim 2019-06-25

Kotlin 中的接口与Java类似,但是它允许有默认实现。这一点与Java 8有些相近,JDK8及以后,允许我们在接口中定义static方法和default方法。

interface MyInterface {
    fun method1();
    
    fun result():Int
    
    fun doIt(){
        print("do it")
    }
}

接口的实现

一个类或者对象可以实现一个或多个接口。

class DefaultImpl :MyInterface{
        override fun result(): Int {
            return 0;
        }

        override fun method1() {
           print("override method 1")
        }

}

接口中的属性

接口中的属性只能是抽象的,不允许初始化值
接口不会保存属性值,实现接口时,必须重写属性

interface MyInterface{
    var name:String //name 属性, 抽象的
}
 
class MyImpl:MyInterface{
    override var name: String = "runoob" //重载属性
}

Demo

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

C 只实现了,只需要重写抽象方法bar().而class D则实现了A,B,而A,B都有方法
foo(),bar(),所以都需要重写,用以指定D如何实现。这与继承中有多个相同方法的处理一样。

欢迎加入学习交流群569772982,大家一起学习交流。

相关推荐