介面Interface

      在〈介面Interface〉中尚無留言

介面的用途

介面跟抽象類別有點類似,也是規定子類別繼承者必需遵守的契約,同時也不能由介面產生出物件。介面除了有抽像方法, 還多了一項規定,就是裏面不可以有實體方法。

kotlin跟Java一樣,都是屬於單一繼承,這跟C++/Python多重繼承不一樣。多重繼承有一個重要的特性,就是同性質多型。先看一下Python的程式碼

class Pokemon:
pass
class Land:
pass
class Pikachu(Pokemon, Land):
pass

這個Pikachu是神奇寶貝,同時也是陸地生物。那麼用kotlin是要如何表達呢? 總不能寫成如下的方式吧

abstract class Pokemon{}
class Land{}
class Pikachu:Pokemon, Land{//kotlin不可以多重繼承
}

介面,就是這個問題的最佳解決方案

語法

底下有一個抽象類別Pokemon及二個介面Land, Water。然後產生一個Frog類別,繼承單一類別,實作多個介面。類別與介面同時寫在 “:”之後,中間用 “,” 隔開,而且順序可以隨便亂寫

abstract class Pokemon{}
interface Land{}
interface Water{}
class Frog : Land, Pokemon, Water{
constructor(){}
}

實作方法

介面只能有抽象方法,不可以有實體方法。每個子類別都必需實作此抽象方法。介面的抽象方法一定是
open abstract,系統會自動加上去,不必手動加入。

abstract class Pokemon{
abstract fun food()
}
interface Land{
fun setWalk()
}
interface Water{
fun setSwing()
}
class Frog : Land, Pokemon, Water{
constructor(){}
override fun food() {}
override fun setWalk() {}
override fun setSwing() {}
}

介面多重繼承

類別只能單一繼承,但介面卻可以多重繼承,如下的Amphibious(兩棲)多重繼承了Land及Water,然後再交給Frog實作。

abstract class Pokemon{
abstract fun food()
}
interface Land{
open abstract fun setWalk()
}
interface Water{
fun setSwing()
}
interface Amphibious: Land, Water{//介面多重繼承

}
class Frog : Amphibious, Pokemon{
constructor(){}
override fun food() {}
override fun setWalk() {}
override fun setSwing() {}
}

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *