誰說介面不能有代碼?—— Kotlin介面簡介(KAD 26),kotlinkad
作者:Antonio Leiva
時間:Jun 6, 2017
原文連結:https://antonioleiva.com/interfaces-kotlin/
與Java相比,Kotlin介面允許你重用更多的代碼。
原因非常簡單:你能夠向你的介面加代碼。如果你已經試用過Java8,這非常類似。
能夠在介面中包括代碼的好處在於,你能夠用更強大的方式使用組合。
Java 6的介面
Java介面的問題是我們僅僅能描述行為,但不能實現它。
這在許多情況下,這足夠了。由於我們想實現一個很好的組合時,它會強制我們將這個介面的實現委託給個別對象,這樣有些情況我們就無法解決。
也使得簡單的組合類別代碼重用相當複雜。
Kotlin的介面
Kotlin給我們帶來好訊息:介面可以有代碼。
這意味著我們可以實現一種多重繼承(在某種程度上有限)。我們可以讓一個類實現幾個介面,並繼承每個介面的行為。
要編寫一個包含一些實現方法的介面,你不需要做任何特殊的是:
1 interface Interface1 {2 fun function1() {3 Log.d("Interface1", "function1 called")4 }5 }
另一個介面2實現另一功能:
1 interface Interface2 {2 fun function2() {3 Log.d("Interface2", "function2 called")4 }5 }
一個實現它們的類,可以同時使用這兩者:
1 class MyClass : Interface1, Interface2 {2 fun myFunction() {3 function1()4 function2()5 }6 }
非常棒!在組織我們的代碼時,這給我們提供了更多的多功能性。
介面不能保持狀態
請記住這個很重要的限制。我們能夠在介面中添加代碼,卻不能有狀態。
這就是說我們不能在介面中建立屬性,用來儲存狀態。如果我們在介面中定義了屬性,實現這個介面的類就需要重寫這個介面。
讓我們來看一個例子。假設介面需要一個上下文:
1 interface Toaster {2 val context: Context3 4 fun toast(message: String) {5 Toast.makeText(context, message, Toast.LENGTH_SHORT).show()6 }7 }
這段代碼比較簡單。這是一個實現顯示Toast方法的介面。它要求上下文來做到這點。
如果我們有一個activity要用這個介面,它就需要重寫這個上下文:
1 class MyActivity : AppCompatActivity(), Toaster {2 override val context = this3 4 override fun onCreate(savedInstanceState: Bundle?) {5 super.onCreate(savedInstanceState)6 toast("onCreate")7 }8 }
我們將Activity本身指定為上下文,介面使用它。就這麼簡單。
現在,你就可以在Activity中使用Toaster函數,且無任何問題。
介面委託
Kotlin另一個非常有趣的特性是介面委託。它是一個非常強大的工具用來實現更清潔的組合。
假設,你有一個類C,由A和B兩個類的對象組成:
1 interface A { 2 fun functionA(){} 3 } 4 5 interface B { 6 fun functionB(){} 7 } 8 9 class C(val a: A, val b: B) {10 fun functionC(){11 a.functionA()12 b.functionB()13 }14 }
類C在自己的代碼中使用函數A和B。
如果對象是由其它組件組合而成的,它能夠很好直接使用那些組件的函數。
這段代碼還有另一種寫法,可以得到相同的結果,就是用介面委託:
1 class C(a: A, b: B): A by a, B by b {2 fun functionC(){3 functionA()4 functionB()5 }6 }
你能夠看到類C實現了A和B,但是,它實際上是委託實現給對象,以參數方式接收。
通過用介面委託,該類可以直接使用來自實作類別的函數,並且仍然將該實現委託給其他對象。
結論
我們已經看到Java介面與Kotlin的之間的差異。現在嘗試找出在什麼情況下可以簡化我們的生活,因為新的想法能夠開闢一個可能的新天地。
這樣你的代碼將比以前更可重用,更易讀了。
還不相信Kotlin可用於Android開發嗎?儘快開始吧!幸虧有前面一系列文章,你可以學習到更多的Kotlin知識,或者在本書中學習從零開始建立一個完整的應用程式。