作者:Antonio Leiva 時間:Jun 6, 2017 原文鏈接:https://antonioleiva.com/interfaces-kotlin/ 與Java相比,Kotlin介面允許你重用更多的代碼。 原因非常簡單:你能夠向你的介面加代碼。如果你已經試用過Java8,這非常類似。 能 ...
時間: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: Context 3 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 = this 3 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知識,或者在本書中學習從零開始創建一個完整的應用程式。