接口

Kotlin中的接口比Java 7中要强大得多。如果你使用Java 8,它们非常相似。在Kotlin中,我们可以像Java中那样使用接口。想象我们有一些动物,它们的其中一些可以飞行。这个是我们针对飞行动物的接口:

interface FlyingAnimal {
    fun fly()
}

鸟和蝙蝠都可以通过扇动翅膀的方式飞行。所以我们为它们创建两个类:

class Bird : FlyingAnimal {
    val wings: Wings = Wings()
    override fun fly() = wings.move()
}

class Bat : FlyingAnimal {
    val wings: Wings = Wings()
    override fun fly() = wings.move()
}

当两个类继承自一个接口,非常典型的是它们两者共享相同的实现。但是Java 7中的接口只能定义行为,但是不能去实现它。

Kotlin接口在某一方面它可以实现函数。它们与类唯一的不同之处是它们是无状态(stateless)的,所以属性需要子类去重写。类需要去负责保存接口属性的状态。

我们可以让接口实现fly函数:

interface FlyingAnimal {
    val wings: Wings
    fun fly() = wings.move()
}

就像提到的那样,类需要去重写属性:

class Bird : FlyingAnimal {
    override val wings: Wings = Wings()
}

class Bat : FlyingAnimal {
    override val wings: Wings = Wings()
}

现在鸟和蝙蝠都可以飞行了:

val bird = Bird()
val bat = Bat()

bird.fly()
bat.fly()