本文概述
- 定义界面
- 为什么要使用Kotlin界面?
- 实施接口
- 实施多个接口
- 解决具有相同方法的不同接口的冲突
定义界面接口是使用关键字interface定义的。例如:
interface MyInterface {val id: Int // abstract propertyfun absMethod()// abstract methodfun doSomthing() {// optional body}}
默认情况下, 仅在没有其方法主体的情况下声明的方法是抽象的。
为什么要使用Kotlin界面?以下是使用界面的原因:
- 使用接口支持多重继承的功能。
- 它可以用来实现松散耦合。
- 它用于实现抽象。
实施接口在此示例中, 我们在InterfaceImp类中实现接口MyInterface。 InterfaceImp类提供在MyInterface接口中声明的属性ID和抽象方法absMethod()的实现。
interface MyInterface{var id: Int// abstract propertyfun absMethod():String// abstract methodfun doSomthing() {println("MyInterface doing some work")}}class InterfaceImp : MyInterface {override var id: Int = 101override fun absMethod(): String{return "Implementing abstract method.."}}fun main(args: Array<
String>
) {val obj = InterfaceImp()println("Calling overriding id value = http://www.srcmini.com/${obj.id}")obj.doSomthing()println(obj.absMethod())}
输出:
Calling overriding id value = http://www.srcmini.com/101MyInterface doing some workImplementing abstract method..
实施多个接口我们可以在同一类中实现不同接口的多个抽象方法。所有抽象方法必须在子类中实现。接口的其他非抽象方法可以从派生类中调用。
例如, 分别使用抽象方法doSomthing()和absMethod()创建两个接口MyInterface1和MyInterface2。这些抽象方法在派生类MyClass中被重写。
interface MyInterface1 {fun doSomthing()}interface MyInterface2 {fun absMethod()}class MyClass : MyInterface1, MyInterface2 {override fun doSomthing() {println("overriding doSomthing() of MyInterface1")}override fun absMethod() {println("overriding absMethod() of MyInterface2")}}fun main(args: Array<
String>
) {val myClass = MyClass()myClass.doSomthing()myClass.absMethod()}
输出:
overriding doSomthing() of MyInterface1overriding absMethod() of MyInterface2
解决具有相同方法的不同接口的冲突让我们看一个示例, 其中接口MyInterface1和接口MyInterface2都包含相同的非抽象方法。 MyClass类提供了这些接口的实现。使用MyClass的对象调用接口的方法会产生错误。
interface MyInterface1 {fun doSomthing(){println("overriding doSomthing() of MyInterface1")}}interface MyInterface2 {fun doSomthing(){println("overriding doSomthing() of MyInterface2")}}class MyClass : MyInterface1, MyInterface2 {}fun main(args: Array<
String>
) {val myClass = MyClass()myClass.doSomthing()}
输出:
Kotlin: Class 'MyClass' must override public open fun doSomthing(): Unit defined in MyInterface1 because it inherits multiple interface methods of it
为了解决上述问题, 我们需要指定要调用的接口的特定方法。让我们看下面的例子。
在下面的示例中, 两个接口MyInterface1和MyInterface2分别包含两个抽象方法adsMethod()和absMethod(name:String)和非抽象方法doSomthing()。 MyClass类同时实现接口和重写抽象方法absMethod()和absMethod(name:String)。要覆盖非抽象方法doSomthing(), 我们需要使用超级关键字作为super < interface_name> .methodName()的方法指定接口名称。
interface MyInterface1 {fun doSomthing() {println("MyInterface 1 doing some work")}fun absMethod()}interface MyInterface2 {fun doSomthing(){println("MyInterface 2 doing some work")}fun absMethod(name: String)}class MyClass : MyInterface1, MyInterface2 {override fun doSomthing() {super<
MyInterface2>
.doSomthing()}override fun absMethod() {println("Implements absMethod() of MyInterface1")}override fun absMethod(n: String) {println("Implements absMethod(name) of MyInterface2 name is$n")}}fun main(args: Array<
String>
) {val myClass = MyClass()myClass.doSomthing()myClass.absMethod()myClass.absMethod("Ashu")}
输出:
MyInterface 2 doing some workImplements absMethod() of MyInterface1Implements absMethod(name) of MyInterface2 name isAshu
interface MyInterface1 {fun doSomthing() {println("MyInterface 1 doing some work")}fun absMethod()}interface MyInterface2 {fun doSomthing() {println("MyInterface 2 doing some work")}fun absMethod() {println("MyInterface 2 absMethod")}}class C : MyInterface1 {override fun absMethod() {println("MyInterface1 absMethod implementation")}}class D : MyInterface1, MyInterface2 {override fun doSomthing() {super<
MyInterface1>
.doSomthing()super<
MyInterface2>
.doSomthing()}override fun absMethod() {super<
MyInterface2>
.absMethod()}}fun main(args: Array<
String>
) {val d = D()val c = C()d.doSomthing()d.absMethod()c.doSomthing()c.absMethod()}
【Kotlin接口】输出:
MyInterface 1 doing some workMyInterface 2 doing some workMyInterface 2 absMethodMyInterface 1 doing some workMyInterface1 absMethod implementation
推荐阅读
- Android Studio安装详细步骤
- Kotlin整数类型范围
- Kotlin内联函数
- Kotlin Hello World应用程序
- Kotlin继承
- Kotlin if表达式
- Kotlin高阶功能
- 命令行中的Kotlin Hello World程序。
- Kotlin第一个程序打印HelloWorld