天天看點

kotlin-接口 kotlin-接口

kotlin-接口

主要内容

  • 接口特性
  • 實作
  • 屬性
  • 重載函數

接口特性

與java 8 中的接口類似,接口允許方法有實作,和抽象類的差別是,接口中的屬性不允許直接初始化,預設是 abstract的。

public interface SomeInterface{
    var value:String //預設abstract

    fun reading() // 未實作

    fun writing(){  //已實作
        // do nothing
    }
}
           

接口聲明與類一緻,猜測接口就是特殊的抽象類,接口可以繼承類,java中是不允許接口繼承類的。

open class Box constructor(var value:String){
    open var name:String = "jason"
}

interface IBox :Box{
    fun beat(){
        println("beat $name")
    }
}
           

接口實作

類或對象能實作一個或多個接口,接口也可以繼承接口

interface IBox2 :IBox{
    override fun beat(){
        println("$name beat IBox2")
    }
}
           

接口定義屬性

允許定義屬性,不允許初始化值,接口不會儲存屬性值,實作接口時,必須重載屬性:

interface MyInterface{
    var name:String //name屬性
}

class MyImpl:MyInterface{
    override var name: String = "jason" //重載屬性
}
           

重載函數

與類繼承一緻,當多個接口中存在相同函數時(同名,參數,傳回值),需要分情況對待:

情況一:有一個接口實作了相同函數,子類不用再實作:

interface MyInterface{
    fun reading():String
}

interface MyAnotherInterface{

    fun reading():String {
        return "jason"
    };
}

/**不需要顯示的重載接口中reading方法**/
class MyImpl:MyInterface,MyAnotherInterface{

}
           

情況二:相同函數接口中都未實作,官網文檔中描述: so the compiler does not know which one to choose, and forces us to override foo() and say what we want explicitly .但是實際上,子類重載的函數中并不需要顯示的指明調用接口的函數:

interface MyInterface{
    fun reading()
}

interface MyInterface2{
    fun reading()
}

class MyImpl:MyInterface,MyInterface2{
    override fun reading() {

    }
}