在本指南中,我们将了解接口。与抽象类类似,无法实例化接口,因为它没有任何构造函数。
注意事项:
- 接口可以同时具有抽象和非抽象函数。
- 接口只能有抽象属性(数据成员),不允许非抽象属性。
- 一个类可以实现多个接口。
- 接口的所有抽象属性和抽象成员函数必须在实现它的类中重写。
Kotlin 接口示例
在下面的例子中,我们有一个接口MyInterface,它包含一个非抽象方法func和抽象属性str和抽象函数demo。
interface MyInterface{var str: Stringfun demo()fun func(){println("Hello")}}class MyClass: MyInterface{override var str: String = "BeginnersBook.com"override fun demo() {println("demo function")}}fun main(args: Array<String>) {val obj = MyClass()obj.demo()obj.func()println(obj.str)}
输出:

Kotlin - 实现多个接口
在以下示例中,我们有两个接口X和Y。类MyClass实现了接口X和Y。该类为接口X和Y的抽象方法提供了实现。
interface X {fun demoX() {println("demoX function")}fun funcX()}interface Y {fun demoY() {println("demoY function")}fun funcY()}// This class implements X and Y interfacesclass MyClass: X, Y {override fun funcX() {println("Hello")}override fun funcY() {println("Hi")}}fun main(args: Array<String>) {val obj = MyClass()obj.demoX()obj.demoY()obj.funcX()obj.funcY()}
输出:

当多个接口具有相同的方法名称时
在下面的例子中,我们有两个接口X和Y,但这两个接口都具有相同的函数demo()。类MyClass实现了这两个接口,现在当我们尝试使用类的对象调用这个函数demo()时,我们将得到编译错误,因为编译器混淆了调用哪个方法。
interface X {fun demo() {println("demoX function")}}interface Y {fun demo() {println("demoY function")}}// This class implements X and Y interfacesclass MyClass: X, Yfun main(args: Array<String>) {val obj = MyClass()obj.demo()}
如何解决相同方法名称的冲突
为了解决上述冲突,我们覆盖了类中的方法,该方法之前导致了冲突。在覆盖方法中,我们使用super关键字确切地指定了要调用的方法。在下面的例子中,我们想调用接口Y的demo()方法,因此我们在覆盖方法中指定了super<Y>.demo()。
interface X {fun demo() {println("demoX function")}}interface Y {fun demo() {println("demoY function")}}// This class implements X and Y interfacesclass MyClass: X, Y{override fun demo() {super<Y>.demo()}}fun main(args: Array<String>) {val obj = MyClass()obj.demo()}
输出:
demoY function
