Kotlin擴(kuò)展函數(shù)和屬性

?在Kotlin中乖篷,為什么會(huì)有擴(kuò)展乘粒?因?yàn)榭梢宰屖褂谜撸ɑ蚨x者)不修改即有源代碼的情況下幢妄,同時(shí)又不借助于裝飾模式等任何一種設(shè)計(jì)模式的情況下着裹, 以一種比較快捷和方便的方式去為一個(gè)即有的類增加功能赶熟,而提供的這樣的一種手段瑰妄。Kotlin通過(guò)擴(kuò)展可以很好的解決Java中充斥的各種輔助類問(wèn)題。

  1. 擴(kuò)展函數(shù)(方法)
    如下所示映砖,是一個(gè)擴(kuò)展函數(shù)的例子:
/**
 * 擴(kuò)展性间坐,extension
 * 在不改變?cè)蓄惤Y(jié)構(gòu)的情況下,給這個(gè)類動(dòng)態(tài)的增加一些額外的功能
 */
class ExtensionTest {
    fun add(a: Int, b: Int) = a + b

    fun sub(a: Int, b: Int) = a - b
}

/**
 * ExtensionTest類的擴(kuò)展方法
 */
fun ExtensionTest.mul(a: Int, b: Int) = a * b

fun main(args: Array<String>) {
    var extensionTest = ExtensionTest();

    println(extensionTest.add(1, 3))
    println(extensionTest.sub(2, 2))
    println(extensionTest.mul(3, 1))
}

輸出結(jié)果:
4
0
3
  • 擴(kuò)展本身并不會(huì)真正的修改目標(biāo)類,也就是說(shuō)它并不會(huì)在目錄類中插入新的屬性或方法竹宋;
  • 擴(kuò)展函數(shù)的解析是靜態(tài)分發(fā)的劳澄,而不是動(dòng)態(tài)的,即不支持多態(tài)蜈七,調(diào)用只取決于對(duì)象的聲明類型秒拔;
  • 調(diào)用是由對(duì)象的聲明類型所決定的,而不是由對(duì)象的實(shí)際類型決定飒硅。
    如下所示:
open class ClassA

class ClassB: ClassA()

fun ClassA.a() = "a"

fun ClassB.a() = "b"

fun myPrint(a: ClassA) {
    println(a.a())
}

fun main(args: Array<String>) {
    myPrint(ClassA())
}

輸出結(jié)果:
a

// 由ClassA改為ClassB砂缩,輸出結(jié)果也是a
fun main(args: Array<String>) {
    myPrint(ClassB())
}

輸出結(jié)果:
a

如果一個(gè)類有了某一個(gè)方法,然后對(duì)這個(gè)類進(jìn)行擴(kuò)展三娩,擴(kuò)展的方法名及簽名都完全一樣庵芭,類里面即有的方法優(yōu)先級(jí)最高。注:不過(guò)實(shí)際情況不會(huì)出現(xiàn)雀监,不會(huì)對(duì)類擴(kuò)展一個(gè)跟類里包含的方法一樣的方法双吆。如下所示:

class ClassC {
    fun foo() {
        println("cc.foo")
    }
}

fun ClassC.foo() {
    println("cc.foo2")
}

fun main(args: Array<String>) {
    ClassC().foo()
}

輸出結(jié)果:
cc.foo
  1. 擴(kuò)展屬性
    如下所示,是一個(gè)擴(kuò)展屬性的例子:
class ExtensionProperty

val ExtensionProperty.name: String
    get() = "hello"

fun main(args: Array<String>) {
    var extensionProperty = ExtensionProperty()
    println(extensionProperty.name)
}

輸出結(jié)果:
hello
  1. 伴生對(duì)象擴(kuò)展
    如下所示会前,是一個(gè)伴生對(duì)象擴(kuò)展的例子:
class CompanionExtension {

    companion object MyObject {

    }
}

fun CompanionExtension.MyObject.method() {
    println("hello world!")
}

fun main(args: Array<String>) {
    CompanionExtension.method()
}

輸出結(jié)果:
hello world!
  1. 擴(kuò)展的作用域
  • 擴(kuò)展函數(shù)所定義在的類實(shí)例叫做分發(fā)接收者(dispatch receiver)好乐;
  • 擴(kuò)展函數(shù)所擴(kuò)展的那個(gè)類的實(shí)例叫做擴(kuò)展接收者(extension receiver);
  • 當(dāng)以上兩個(gè)名字出現(xiàn)沖突時(shí)瓦宜,擴(kuò)展接收者的優(yōu)先級(jí)最高蔚万。
    如下所示:
class Demo {
    fun method() {
        println("demo method")
    }
}

class Demo2() {
    fun method2() {

    }

    fun Demo.hello() {
        method()
        method2()
    }

    fun world(demo: Demo) {
        demo.hello()
    }

    fun Demo.output() {
        println(toString())
        println(this@Demo2.toString())
    }

    fun test() {
        var demo = Demo()
        demo.output()
    }
}

fun main(args: Array<String>) {
    Demo2().test()
}

輸出結(jié)果:
com.ssy.kotlin.demo.Demo@6e0be858
com.ssy.kotlin.demo.Demo2@61bbe9ba

注:this@Demo2,Kotlin提供的特殊語(yǔ)法歉提,是為了解決函數(shù)(方法)重名的問(wèn)題笛坦,this@分發(fā)接收者的名字墓陈。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末混聊,一起剝皮案震驚了整個(gè)濱河市勉抓,隨后出現(xiàn)的幾起案子踪栋,更是在濱河造成了極大的恐慌琳拭,老刑警劉巖懈贺,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件堂氯,死亡現(xiàn)場(chǎng)離奇詭異得院,居然都是意外死亡悼尾,警方通過(guò)查閱死者的電腦和手機(jī)柿扣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)闺魏,“玉大人未状,你說(shuō)我怎么就攤上這事∥銮牛” “怎么了司草?”我有些...
    開封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵艰垂,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我埋虹,道長(zhǎng)猜憎,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任搔课,我火速辦了婚禮胰柑,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘爬泥。我一直安慰自己柬讨,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開白布急灭。 她就那樣靜靜地躺著姐浮,像睡著了一般谷遂。 火紅的嫁衣襯著肌膚如雪葬馋。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天肾扰,我揣著相機(jī)與錄音畴嘶,去河邊找鬼。 笑死集晚,一個(gè)胖子當(dāng)著我的面吹牛窗悯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播偷拔,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼蒋院,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了莲绰?” 一聲冷哼從身側(cè)響起欺旧,我...
    開封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蛤签,沒(méi)想到半個(gè)月后辞友,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡震肮,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年称龙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片戳晌。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鲫尊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出沦偎,到底是詐尸還是另有隱情疫向,我是刑警寧澤竞帽,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站鸿捧,受9級(jí)特大地震影響屹篓,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜匙奴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一堆巧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧泼菌,春花似錦谍肤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至焊刹,卻和暖如春系任,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背虐块。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工俩滥, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人贺奠。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓霜旧,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親儡率。 傳聞我的和親對(duì)象是個(gè)殘疾皇子挂据,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

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