07-接口
5.4 接口
接口泛指实体把自己提供给外界的一种抽象化物,用以由内部操作分离出外部沟通方法,使其能被内部修改而不影响外界其他实体与其交互的方式。
接口是面向对象编程语言中的一个重要抽象类型,是抽象方法的集合。严格来说,接口也属于一个特殊的类,这个类中只有抽象方法和全局常量。接口只能在继承类中实例化,实现接口时,必须覆写接口中的全部抽象方法。
Kotlin的接口和Java 8很类似,都可以包含抽象方法以及方法的实现。和Java接口的定义方式相同,Kotlin接口也使用关键字interface来定义。接口的定义格式如下。
interface 接口名{
…
}
一个类中可以定义一个或多个接口。代码如下。
interface MyInterface {
fun bar()
fun foo() {
//可选的方法体
}
}
Java使用implements关键字来实现接口,而在Kotlin中则通过冒号的方式来实现接口。格式如下。
class 类名 : 接口名{
… //重写的接口函数、属性等
}
1.接口属性
和Java一样,Kotlin的接口也允许有方法和属性。与Java不同的是,Kotlin中的属性默认为abstract,在接口中不能初始化,必须在实现类中初始化,初始化时使用override关键字修饰;其次,Kotlin中的方法可以为抽象,也可以有具体的实现,实现的方法在具体类中可以不用覆写。
interface Wing{
fun fly() {
println("Wing")
}
}
class Example : Wing{
fun test(){
fly()
}
}
2.解决覆盖冲突
当实现多个接口时,可能会出现一个方法的多种实现问题。代码如下。
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()
}
}
在上面的例子中,接口A、B都声明了方法foo()和bar(),两者也都实现了foo(),但只有B实现了bar(),在接口A中bar()方法被声明为抽象方法。这是因为在接口中如果函数没有函数体,那么默认就是抽象的。因为C类是一个实现了A的具体类,所以必须重写bar()来实现这个抽象方法。
对于D类来说,因为bar()方法在接口B中已有实现,所以该方法不需要重写。如果想调用B接口的具体实现则需要使用super关键字,调用的具体方式为super.bar()。但是对于foo()方法来说,因为两个接口都有实现,所以在重写foo()时,需要明确该方法的调用及实现。