Kotlin中的接口谷婆,誰說接口不能有實(shí)現(xiàn)代碼

本文鏈接
本文結(jié)合自己的感受慨蛙,做一下簡單的翻譯。原文作者也是《Kotlin for Android developer》的作者纪挎。此譯文供大家學(xué)習(xí)參考之用期贫。

Kotlin中的接口,誰說接口不能有實(shí)現(xiàn)代碼

相比Java异袄,用Kotlin寫的接口允許你復(fù)用更多代碼通砍。理由很簡單:你可以加實(shí)現(xiàn)代碼到接口中。如果你在Java8中嘗試烤蜕,也是類似的封孙。在接口中加實(shí)現(xiàn)代碼是一件不錯(cuò)的事情,這是你能使用更多強(qiáng)大的代碼組合方式讽营。然后我們接下去看看虎忌。

Java 6中的接口

Java接口的問題是我們只能定義描述行為,但是不能有實(shí)現(xiàn)橱鹏。很多的時(shí)候膜蠢,這夠了,但是如果我們要達(dá)到更好的組合方式蚀瘸,由于強(qiáng)制我們把接口的實(shí)現(xiàn)委托給實(shí)現(xiàn)對象狡蝶,這些情況不能解決庶橱。這樣使得本來簡單組合一下可重用代碼片段就能解決的問題贮勃,變的復(fù)雜化了。

Kotlin中使用接口

Kotlin帶給我們一些好消息:接口可以有實(shí)現(xiàn)代碼苏章。這個(gè)意味著我們能實(shí)現(xiàn)一種類的多重繼承(有些例子中有部分限制)寂嘉。我們能讓一個(gè)類實(shí)現(xiàn)幾個(gè)接口,從每個(gè)接口繼承行為(有實(shí)現(xiàn)代碼)枫绅。(Java中的類不能多重繼承類泉孩,這是一個(gè)很大的限制)

寫一些有方法實(shí)現(xiàn)的接口,你不需要做任何特別的:


interface Interface1 {
    fun function1() {
        Log.d("Interface1", "function1 called")
    }
}

我們有另外一個(gè)接口2實(shí)現(xiàn)了其他方法:


interface Interface2 {
    fun function2() {
        Log.d("Interface2", "function2 called")
    }
}

有一個(gè)類都實(shí)現(xiàn)了他們沒有問題:


class MyClass : Interface1, Interface2 {
    fun myFunction() {
        function1()
        function2()
    }
}

好并淋,當(dāng)組織我們代碼的時(shí)候寓搬,這給我們更多的多樣性。

接口不能持有狀態(tài)

這在思考代碼時(shí)候有一個(gè)重要的限制县耽。我們能有實(shí)現(xiàn)代碼但是沒有狀態(tài)句喷。這意味著我們不能創(chuàng)建一個(gè)屬性镣典,然后用它存儲狀態(tài)。如果我們在接口中定義了一個(gè)屬性唾琼,這個(gè)類實(shí)現(xiàn)了它就必須重寫這個(gè)屬性兄春。(你可以定義這個(gè)屬性在接口中,但是實(shí)現(xiàn)類必須重寫锡溯,本質(zhì)是定義一個(gè)該屬性的get方法)

讓我們看一個(gè)例子赶舆。想象一下這個(gè)接口需要上下文:


interface Toaster {
    val context: Context
 
    fun toast(message: String) {
        Toast.makeText(context, message, Toast.LENGTH_SHORT).show()
    }
}

這個(gè)代碼很簡單。這個(gè)接口有一個(gè)實(shí)現(xiàn)的方法用來顯示一個(gè)Toast祭饭。 它需要一個(gè)上下文來做這些事情芜茵。如果我們有一個(gè)Activity要用這個(gè)接口,需要重寫這個(gè)上下文:


class MyActivity : AppCompatActivity(), Toaster {
    override val context = this
 
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        toast("onCreate")
    }
}

簡單的甜癞,我們設(shè)置這個(gè)Activity 自己作為上下文夕晓,這個(gè)接口就使用它。 現(xiàn)在你可以在這個(gè)Activity 使用Toaster 函數(shù)沒有任何問題悠咱。

接口委托

在Kotlin中另外的非常有趣的特性是接口委托蒸辆。這個(gè)是非常強(qiáng)大的工具讓你能實(shí)現(xiàn)一個(gè)更干凈的代碼組合。想象你有一個(gè)類C析既,組合了類A和B的2個(gè)對象:


interface A {
    fun functionA(){}
}
 
interface B {
    fun functionB(){}
}
 
class C(val a: A, val b: B) {
    fun functionC(){
        a.functionA()
        b.functionB()
    }
}

類C在自己代碼中使用A和B的函數(shù)躬贡。如果一個(gè)對象是組合自它們的組件,那它就可以直接的使用它們的函數(shù)眼坏。
使用接口委托是另外一種寫法拂玻,結(jié)果和上面一樣的方式:


class C(a: A, b: B): A by a, B by b {
    fun functionC(){
        functionA()
        functionB()
    }
}

你能看到類C實(shí)現(xiàn)了A和B,但是它接受作為參數(shù)宰译,對象全部委托實(shí)現(xiàn)(個(gè)人理解是一個(gè)繼承轉(zhuǎn)化為組合的方式)檐蚜。使用接口委托,這個(gè)類能直接使用被實(shí)現(xiàn)類的函數(shù)沿侈,并且包括使用其他對象委托實(shí)現(xiàn)闯第。

總結(jié)

我們看到了Java和Kotlin接口的不同之處。現(xiàn)在試著找出簡單的解決方式缀拭,這些新的方式打開了許多世界的可能咳短。你們的代碼會比之前有更多的復(fù)用性,以及更好的可讀性蛛淋。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末咙好,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子褐荷,更是在濱河造成了極大的恐慌勾效,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異层宫,居然都是意外死亡绘迁,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進(jìn)店門卒密,熙熙樓的掌柜王于貴愁眉苦臉地迎上來缀台,“玉大人,你說我怎么就攤上這事哮奇√鸥” “怎么了?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵鼎俘,是天一觀的道長哲身。 經(jīng)常有香客問我,道長贸伐,這世上最難降的妖魔是什么勘天? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮捉邢,結(jié)果婚禮上脯丝,老公的妹妹穿的比我還像新娘。我一直安慰自己伏伐,他們只是感情好宠进,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著藐翎,像睡著了一般材蹬。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上吝镣,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天堤器,我揣著相機(jī)與錄音,去河邊找鬼末贾。 笑死闸溃,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的未舟。 我是一名探鬼主播圈暗,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼掂为,長吁一口氣:“原來是場噩夢啊……” “哼裕膀!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起勇哗,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤昼扛,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體抄谐,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡渺鹦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蛹含。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片毅厚。...
    茶點(diǎn)故事閱讀 40,015評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖浦箱,靈堂內(nèi)的尸體忽然破棺而出吸耿,到底是詐尸還是另有隱情,我是刑警寧澤酷窥,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布咽安,位于F島的核電站,受9級特大地震影響蓬推,放射性物質(zhì)發(fā)生泄漏妆棒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一沸伏、第九天 我趴在偏房一處隱蔽的房頂上張望糕珊。 院中可真熱鬧,春花似錦毅糟、人聲如沸放接。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽纠脾。三九已至,卻和暖如春蜕青,著一層夾襖步出監(jiān)牢的瞬間苟蹈,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工右核, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留慧脱,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓贺喝,卻偏偏與公主長得像菱鸥,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子躏鱼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,969評論 2 355

推薦閱讀更多精彩內(nèi)容