## Kotlin 繼承
Kotlin 的繼承與 Java 類似,Java 使用 extends 關鍵字而 Kotlin 使用“:”符號來實現(xiàn)對父類的繼承深寥。需要注意的是 Kotlin 的類默認是 final 的,如果要允許創(chuàng)建一個類的子類框沟,需要使用 open 關鍵字來修飾忘巧。
? ? open class View{
? ? }
可以被重寫的方法或者屬性同樣需要加上 open 關鍵字
? ? open class View{
? ? ? ? open val area = 0
? ? ? ? open fun click(){}
? ? }
一個可以被繼承的子類的寫法
? ? open class ClickableView: View{
? ? ? ? override val area = 1
? ? ? ? override fun click(){}
? ? }
override 意味的同樣繼承了父類的可訪問性,如果需要上面一段代碼中的 click 方法不被子類重寫喂柒,需要添加 final 關鍵字
? ? open class ClickableView: View{
? ? ? ? override val area = 1
? ? ? ? final override fun click(){}
? ? }
上面已經(jīng)說了不瓶,Kotlin的類默認是 final 的,所以默認是不可以被繼承的灾杰。需要注意一定蚊丐,不可變屬性是不可以被可變屬性重寫的,以下寫法是錯誤的:
? ? open class Button: ClickableView{
? ? ? ? override var area = 1 //錯誤var屬性不可以覆蓋val屬性
? ? }
仔細想一下為什么艳吠,父類中的不可變屬性編譯時會生成一個 getX() 的方法麦备,而子類中如果使用可變屬性來重寫,除了會生成 getXX() 方法以外昭娩,還會生成 setXX() 方法凛篙,擴大了使用范圍,所以在編譯時會出錯栏渺!
以上是關于 Kotlin 繼承的內(nèi)容呛梆,那么為什么 Kotlin 為什么會默認將類設置為 final 呢,以下內(nèi)容摘自《Kotlin 實戰(zhàn)》磕诊,它解釋了默認類為 final 的意義:
>類默認為 final 帶來了一個重要的好處就是這使得在大量場景中的智能轉 換成為可能 填物。 正如我們在 2.3.5 節(jié)中提到的,智能轉換只能在進行類型檢查后沒 有改變過的變量上起作用 霎终。 對于一個類來說滞磺,這意味著智能轉換只能在 val 類 型并且沒有自定義訪問器的類屬性上使用 。這個前提意味著屬性必須是 final 的 莱褒, 否則如果一個子類可以重寫屬性并定義一個自定義的訪問器將會打破智能轉換 的關鍵前提击困。 因為屬性默認是 final 的,可以在大多數(shù)屬性上不加思考地使用 智能轉換广凸,這提高了你的代碼表現(xiàn)力 阅茶。