Kotlin教程:定义接口与实现

2020-04-2311:32:39编程语言入门到精通Comments1,986 views字数 3776阅读模式

接口是类的蓝图(基础框架)。Kotlin接口类似于Java 8中的接口,它包含抽象方法声明以及方法的实现。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18301.html

定义接口

接口是使用interface关键字来定义的。 例如:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18301.html

interface MyInterface {
    val id: Int // abstract property  
    fun absMethod()// abstract method  
    fun doSomthing() {
        // optional body  
    }
}
Kotlin

默认情况下,仅在没有方法体(方法只声明未实现)的情况下声明的方法是抽象的。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18301.html

为什么要使用Kotlin接口?

以下是使用接口的理由:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18301.html

  • 使用接口支持多重继承功能。
  • 它可以用来实现松耦合。
  • 它用于实现抽象。

一个类只能扩展一个超类但可以实现多个接口。 父类或接口实现的扩展是在子类中使用(:)运算符完成的。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18301.html

实现接口

在这个例子中,在InterfaceImp类中实现了MyInterface接口。 InterfaceImp类提供了在MyInterface接口中声明的属性id和抽象方法absMethod()的实现。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18301.html

interface MyInterface  {
    var id: Int            // abstract property
    fun absMethod():String    // abstract method
    fun doSomthing() {
        println("MyInterface做了一些工作")
    }
}
class InterfaceImp : MyInterface {
    override var id: Int = 10010
    override fun absMethod(): String{
        return "实现抽象方法.."
    }
}
fun main(args: Array<String>) {
    val obj = InterfaceImp()
    println("调用覆盖id值,当前 ID = ${obj.id}")
    obj.doSomthing()
    println(obj.absMethod())
}
Kotlin

执行上面示例代码,得到以下结果 -文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18301.html

调用覆盖id值,当前 ID = 10010
MyInterface做了一些工作
实现抽象方法..
Shell

实现多个接口

可以在同一个类中实现不同接口的多个抽象方法。 所有抽象方法都必须在子类中实现。 可以从派生类调用其他非抽象的接口方法。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18301.html

例如,分别使用抽象方法doSomthing()absMethod()创建两个接口MyInterface1MyInterface2,然后在派生类MyClass中覆盖这些抽象方法。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18301.html

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()
}
Kotlin

执行上面示例代码,得到以下结果 -文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18301.html

overriding doSomthing() of MyInterface1
overriding absMethod() of MyInterface2
Shell

解决具有相同方法的不同接口覆盖冲突

让我们先来看看一个示例,接口MyInterface1和接口MyInterface2都包含相同的非抽象方法。 MyClass类提供了这些接口的实现。 使用MyClass对象调用接口方法时会产生错误。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18301.html

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

执行上面示例代码,得到以下结果 -文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18301.html

Error:(11, 1) Kotlin: Class 'MyClass' must override public open fun doSomthing(): Unit defined in MyInterface1 because it inherits multiple interface methods of it
Shell

要解决上述问题,需要指定调用的特定接口方法。看下面的例子。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18301.html

在下面的示例中,两个接口MyInterface1MyInterface2分别包含两个抽象方法adsMethod()absMethod(name:String)以及非抽象方法doSomthing()MyClass类实现接口和覆盖抽象方法absMethod()absMethod(name:String)。 要覆盖非抽象方法doSomthing(),需要使用super关键字指定接口名称为super <interface_name> .methodName()文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18301.html

示例1文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18301.html

interface MyInterface1 {
    fun doSomthing() {
        println("MyInterface 1 做了一些工作")
    }
    fun absMethod()
}
interface MyInterface2 {
    fun doSomthing(){
        println("MyInterface 2 做了一些工作")
    }
    fun absMethod(name: String)
}
class MyClass : MyInterface1, MyInterface2 {
    override fun doSomthing() {
        super<MyInterface2>.doSomthing()
    }

    override fun absMethod() {
        println("实现了 MyInterface1 的 absMethod() 方法")
    }
    override fun absMethod(n: String) {
        println("实现了 MyInterface1 的 absMethod(name) 方法,名称是:$n")
    }
}
fun main(args: Array<String>) {
    val myClass = MyClass()
    myClass.doSomthing()
    myClass.absMethod()
    myClass.absMethod("Maxsu")
}
Kotlin

执行上面示例代码,得到以下结果 -文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18301.html

MyInterface 2 做了一些工作
实现了 MyInterface1 的 absMethod() 方法
实现了 MyInterface1 的 absMethod(name) 方法,名称是:Maxsu
Shell

示例2文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18301.html

interface MyInterface1 {
    fun doSomthing() {
        println("MyInterface1 doSomthing方法执行")
    }
    fun absMethod()
}

interface MyInterface2 {
    fun doSomthing() {
        println("MyInterface2 doSomthing方法执行")
    }
    fun absMethod() {
        println("MyInterface2 absMethod方法执行")
    }

}

class C : MyInterface1 {
    override fun absMethod() {
        println("MyInterface1 absMethod 方法实现")
    }
}

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

执行上面示例代码,得到以下结果 -文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18301.html

MyInterface1 doSomthing方法执行
MyInterface2 doSomthing方法执行
MyInterface2 absMethod方法执行
MyInterface1 doSomthing方法执行
MyInterface1 absMethod 方法实现

//原文出自【易百教程】,商业转载请联系作者获得授权,非商业转载请保留原文链接:https://www.yiibai.com/kotlin/kotlin-interface.html#article-start文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18301.html

文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18301.html
  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/ymba/18301.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定