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

来源:http://www.cnblogs.com/figozhg/archive/2017/06/10/6979138.html
-Advertisement-
Play Games

作者:Antonio Leiva 時間:Jun 6, 2017 原文鏈接:https://antonioleiva.com/interfaces-kotlin/ 與Java相比,Kotlin介面允許你重用更多的代碼。 原因非常簡單:你能夠向你的介面加代碼。如果你已經試用過Java8,這非常類似。 能 ...


作者: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: 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,由AB兩個類的對象組成:

 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實現了AB,但是,它實際上是委托實現給對象,以參數方式接收。

 

通過用介面委托,該類可以直接使用來自實現類的函數,並且仍然將該實現委托給其他對象

 

 

結論

 

 

 

我們已經看到Java介面與Kotlin的之間的差異。現在嘗試找出在什麼情況下可以簡化我們的生活,因為新的想法能夠開闢一個可能的新天地。

 

這樣你的代碼將比以前更可重用,更易讀了。

 

 

還不相信Kotlin可用於Android開發嗎?儘快開始吧!幸虧有面一系列文章,你可以學習到更多的Kotlin知識,或者在本書中學習從零開始創建一個完整的應用程式。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 簡單的省市區三級聯動,適合初學者入門學習的案例 目錄結構如下: 三級聯動.html 跟 JS文件夾是同個級別 效果圖如下: HTML代碼: JS代碼: ...
  • 環境搭建 環境搭建可以參考RN官網,也可以參考中文版本:http://reactnative.cn/docs/0.45/getting-started.html 如果你希望可以看到原版的安裝流程,可以看官方的地址,本文只是我個人的實踐,並且僅限於window平臺。 官方的地址:https://fac ...
  • 一 start命令 ionic start sdscapp --type=ionic1 ...
  • UX瀏覽服務是為了加速瀏覽網頁而開發的瀏覽服務,它解決了WebView的一系列問題,它能夠在網路差的情況下快速的瀏覽,比webview快一倍以上,是webview的優化代替方案。它擁有完善的緩存管理策略,經過優化的載入順序,廣告攔截引擎。 這次更新我們修複大量問題: 1. 緩存加速、DNS加速、弱網 ...
  • 一、在app/src/main/res下有 AndroidManifest.xml打開,打開後如下圖1 二、日誌工具log log.v() log.d() log.i() log.w() log.e() 在下圖中 中存在輸出 ...
  • 先看效果: 參照Android的實現方式用RadioButton來實現,但是Uwp的RadioButton並沒有安卓的Selector選擇器 下麵是一個比較簡單的實現,如果有同學有更好的實現,歡迎留言,讓我們共同進步。 1、首先自定義一個RadioImageButton控制項,並定義幾個依賴屬性,代碼 ...
  • 1.Android DVM(Dalvik VM)的進程和Linux的進程, 應用程式的進程是同一個概念嗎? DVM(Dalvik VM)指dalvik的虛擬機。每一個Android應用程式都在它自己的進程中運行,都擁有一個獨立的Dalvik虛擬機實例。而每一個DVM都是在Linux 中的一個進程,所 ...
  • iOS CAShapeLayer、CADisplayLink 實現波浪動畫效果 效果圖 代碼已上傳 GitHub:https://github.com/Silence GitHub/CoreAnimationDemo 可以自定義波浪高度、寬度、速度、方向、漸變速度、水的深度等參數。 實現原理 波浪的 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...