誰說介面不能有代碼?—— Kotlin介面簡介(KAD 26),kotlinkad

來源:互聯網
上載者:User

誰說介面不能有代碼?—— 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知識,或者在本書中學習從零開始建立一個完整的應用程式。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.