關於Kotlin中抽象類和接口的一點總結

抽象類和接口

一、Kotlin中的接口

定義上:

Kotlin中的接口跟Java8是很類似的,可以包含抽象方法的定義也可以包含抽象方法的實現,但是不包含任何狀態。

語法規則上:

interface關鍵字用來修飾Kotlin中的接口,這個和java類似的

interface Clickable{
    fun click()
}

使用的時候是這樣的

class Button :Clickable{
     override fun click()=println("I was clicked")
}

這裏有需要注意的點,

(1)、Kotlin是使用:來表示繼承和實現的,這個區別於java

(2)、另外 override 是Kotlin裏的關鍵字,在java那邊是屬於複寫的註解,Kotlin裏這個關鍵字使用是強制要求的。

(3)、java 8的接口裏的默認實現的方法是用 default關鍵字來修飾的,Kotlin中並不需要。

(4)、Kotlin和java中接口裏的靜態方法都是用接口直接調用,不能使用實現他的子類來調用,這裏要注意的是java裏的靜態方法是這樣定義的

//java中的靜態方法
class TestMode{
   static void show(){
      println("靜態方法");
   }
}
//Kotlin中的靜態方法
class TestMode2{
     companion object{
        fun showOff2()=println("來自靜態方法")
    }
}

(5)、Kotlin中實現的多個接口中,有相同的默認實現的方法的,子類一定要複寫該方法,這個和java保持一致。其實就是爲了讓子類自己來決定他到底要調用哪個接口中的方法。子類必須複寫該方法,如果子類在複寫的方法中要調用接口的實現,Kotlin和java在語法上有些區別

//Kotlin 類似下面
super<TestMode>.show()
//java 類似下面
TestMode.super.show()

(6)、Kotlin的接口中的成員始終是open的,不能將其聲明爲final。

二、Kotlin中的抽象類

我們需要簡單瞭解下Kotlin中的類修飾符

修飾符 說明
final 不能被繼承
open 可以被繼承
abstract 抽象類
enum 枚舉類
data 數據類
sealed 密封類
annotation 註解類

我們知道java中的類默認是可以被繼承的,除非我們顯式的生命了final類,這其實是違背優秀的java編程風格的,雖然在《Effective Java》中明確強調了我們設計的基類如果不是爲了繼承而設計,我們應該毫不猶豫的將其聲明爲final類,但是到今天,我們Java程序員的編程風格中顯然是沒有按照這個風格進行的。Kotlin是遵從了這個設計風格的,Kotlin的類默認是final的。在Kotlin中如果想讓該類可以被繼承那就需要顯式的將其聲明爲open,

我們要說的是抽象類所以abstract是必不可少的了,這和java是保持一致的,Kotlin中抽象類的成員默認是open的,這裏有需要注意的點,如果函數沒有方法體,他就是抽象的,但是abstract關鍵字不是必須的(這裏可能有點歧義,我所說的比如接口中的方法,並沒有用abstract修飾)。

三、Kotlin中抽象類和接口的區別

這個其實跟java語言中設計抽象類和接口的區別是大同小異的,抽象類還是在類的層面上來看問題的,具有自己的構造方法和成員變量和成員方法,是在類的基礎上的一種抽象,日常項目開發中把我們需要的一些通用方法儘量上移,把一些需要不同實現的方法,也上移,這個時候我們使用抽象類,就可以很好的來解決這個問題,接口可以理解爲對行爲的一種抽象,對一類行爲的(方法)的抽象,接口的設計是爲了解耦的,單獨的依靠抽象類,並不能將定義和實現很好的分離開來,一味的在抽象類中新加含有具體實現的方法,其實是對不需要該方法的子類的一種污染,一味的新加抽象方法,也需要對子類不斷的更改,這個時候我們使用接口來定義這種行爲,在需要的子類中實現該接口,就可以很好的處理這個問題。

Kotlin設計接口是爲我們提供一種將接口和實現分離的更加結構化的方法。抽象類是接口和普通類之間的一種中庸之道,但是兩者都有其存在的意義。抽象類和接口在設計模式以及解耦方面有着不可替代的作用。這也是大部分面向對象的語言都有抽象類和接口設計的原因,也是爲了彌補無法多重繼承的遺憾。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章