当前位置:嗨网首页>书籍在线阅读

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()时,需要明确该方法的调用及实现。