声明与实现

Kotlin的接口和Java8的接口很像,可以声明抽象方法和非抽象方法。

interface Animal{
    fun run()
    fun eat(){
        println("吃东西")
    }
}

编写一个类实现接口:

class Dog : Animal{
    override fun run() {
        println("i can run")
    }
}

接口继承

接口之间可以进行继承,语法和类的继承一样:

interface Animal{
    fun run()
    fun eat(){
        println("吃东西")
    }
}
interface LandAnimal : Animal{
    fun dig(){
        println("我会挖洞")
    }
}
class Dog : LandAnimal{
    override fun run() {
        println("i can run")
    }
}
Dog().dig()

多继承

在大型项目中,我们的类可能会继承多个接口,而多个接口可能会存在重复的方法。比如:

interface A {
    fun eat()
    fun run(){
        println("A run")
    }
}

interface B {
    fun eat(){
        println("B eat")
    }
    fun run(){
        println("B run")
    }
}

A和B接口有着重复的方法,A实现了run方法,B实现了eatrun方法。假设类C同时继承了A和B,那么它需要实现这两个方法。比如:

class C : A, B{
    override fun run() {
        println("c run")
    }
    override fun eat() {
        println("c eat")
    }
}

如果类C在run方法中想调用父类对run的实现,应该怎么做呢?

你很快会猜到应该这样写:

class C : A, B{
    override fun run() {
        super.run() //会编译出错
        println("c run")
    }
    override fun eat() {
        println("c eat")
    }
}

但是事与愿违,直接调用super.run()会编译报错,原因是A和B都实现了run,编译器搞不懂你的super.run()是要调用谁。所以需要明确指定我们要调用谁的实现,比如想调用A的实现,代码如下:

override fun run() {
    super<A>.run() //编译通过
    println("c run")
}

如果C想在eat方法中调用父类的实现,则直接调用super.eat()即可,因为2个父类中只有B实现了eat方法,编译器能确定调用的是谁。比如:

override fun eat() {
    super.eat() //编译通过
    println("c eat")
}
更新时间: 6/1/2019, 11:25:02 AM