kotlin 類委托 “by” 關(guān)鍵字

在擴(kuò)展一個類并重寫某些方法時,你的代碼就變得依賴你自己繼承的那個類的實現(xiàn)細(xì)節(jié)了。當(dāng)你的基類的實現(xiàn)被修改或者新方法被添加進(jìn)去,你做出的類行為的假設(shè)會失效,所以你的代碼也許最后就會以不真確的行為告終。
因為有以上原因,kotlin的默認(rèn)類都被修飾 final 不可更改的。
實現(xiàn):by 委托,它的實現(xiàn)思想其實跟設(shè)計模式中的裝飾器模式一樣
如:

// 定義一個接口,和一個方法 show()
interface Base {
fun show()
}

// 定義類實現(xiàn) Base 接口, 并實現(xiàn) show 方法
open class BaseImpl : Base {
override fun show() {
print("BaseImpl::show()")
}
}

// 將Base中所有的實現(xiàn)都委托給base 對象,這個類本身就不需要去實現(xiàn)Base接口中的方法
class BaseProxy(base: Base) : Base by base

// main 方法
fun main(args: Array<String>) {
val base = BaseImpl()
BaseProxy(base).show()
}
分析:每次在實現(xiàn)接口時,都需要實現(xiàn)接口中的所有方法,by也就是將 Base 接口中需要實現(xiàn)的
方法都委托給BaseImpl 類去實現(xiàn),所以這里這樣寫 :Base by base 其實也就是說,我實現(xiàn)了接口
Base,但我本身不實現(xiàn)Base接口中的方法,委托給base幫我實現(xiàn),那么在調(diào)用的時候就傳入有具體實現(xiàn)了Base接口的類,方便我們的委托。
這里:
// 傳入了BaseImpl類的引用,BaseImpl 必須是實現(xiàn)了Base接口的類
val base = BaseImpl()
// 傳入了BaseImpl類的引用,這里在調(diào)用的時候也是調(diào)用BaseImpl中的方法
BaseProxy(base).show()

/* 在這里就把整個接口的實現(xiàn)委托給 持有 base 引用的類去實現(xiàn)接口Base中具體的方法
不代表Base接口在其他地方一定要有被其他實體類實現(xiàn)了才可以使用by 委托,即使在其他地方?jīng)]
有實現(xiàn)Base 接口也可以使用 Base接口的對象去委托 */
class BaseProxy(base: Base) : Base by base

總結(jié):
原理:代碼中的的重要思想也就是我們面向?qū)ο笾凶铍y理解的多態(tài)
多態(tài)的三大特征是(繼承,封裝,實現(xiàn))

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容