kotlin之擴充套件

2021-10-17 02:28:37 字數 2344 閱讀 7556

通常要對乙個類進行擴充套件,可以使用繼承或者設計模式如裝飾者模式,kotlin中提供了另外一種方法:extension。

為乙個類新增方法:

package com.morris.kotlin.extension

fun mutablelist

.swap

(from: int,

to: int)

funmain()

擴充套件功能並沒有實際修改類,並沒有往類的位元組碼中插入新的成員,僅僅只是讓這個新的成員可以通過類的變數進行訪問,看起來像類的成員一樣。

擴充套件是被靜態解析的,而不像多型一樣動態解析,也就說呼叫具體哪個類的方法取決於宣告引數的型別,而不是執行時引數的實際型別。

package com.morris.kotlin.extension

open

class shape

class rectangle:

shape()

fun shape.

getname()

="shape"

fun rectangle.

getname()

="rectangle"

funprintclassname

(s: shape)

funmain()

如果乙個類有乙個成員方法,並且擴充套件的方法簽名一樣,那麼類中的方法優先,過載的方法可以實現增強。

class example 

}fun example.

printfunctiontype()

fun example.

printfunctiontype

(i: int)

funmain()

fun any?

.tostring()

: string

val

list

.lastindex: int

get()

= size -

1

以下語法並不支援:

val house.number =

1// error: initializers are not allowed for extension properties

不能直接擴充套件屬性,只能擴充套件屬性對應的setter和getter,因為屬性最終的表現形式為setter和getter。

class myclass 

// will be called "companion"

}fun myclass.companion.

printcompanion()

funmain()

前面介紹的擴充套件都是定義在頂層,其實也可以將乙個類的擴充套件作為成員定義在另乙個類的內部。

擴充套件函式定義所在的類的例項稱為分發接收者(dispatch receiver),擴充套件函式所擴充套件的那個類稱為擴充套件接收者(extension receiver)。

class

host

(val hostname: string)

}class

connection

(val host: host,

val port: int)

fun host.

printconnectionstring()

funconnect()

}fun

main()

如果分發接收者和擴充套件接收者中方法的名字出現衝突,擴充套件接收者的優先順序高。

class connection 

}

作為成員的擴充套件宣告也可以使用open關鍵字修飾,然後在子類中重寫。分發接收者是動態解析的,但是擴充套件接收者是靜態解析的。

open

class base

class derived :

base()

open

class basecaller

open

fun derived.

printfunctioninfo()

funcall

(b: base)

}class derivedcaller:

basecaller()

override

fun derived.

printfunctioninfo()

}fun

main()

kotlin 擴充套件

kotlin允許擴充套件類的屬性和方法,不需要繼承或使用 decorator 模式。擴充套件是一種靜態行為,對被擴充套件的類 本身不會造成任何影響。擴充套件函式定義形式 fun receivertype functionname params 其中,receivertype 為待擴充套件的類名,修飾...

Kotlin 擴充套件

kotlin 可以對乙個類的屬性和方法進行擴充套件,且不需要繼承或使用 decorator 模式。擴充套件是一種靜態行為,對被擴充套件的類 本身不會造成任何影響。擴充套件函式可以在已有類中新增新的方法,不會對原類做修改,擴充套件函式定義形式 fun receivertype functionname...

Kotlin 擴充套件

伴生物件的擴充套件 擴充套件的作用域 擴充套件宣告為成員 endkotlin可以對乙個類的屬性和方法進行擴充套件,且不需要繼承或使用decorator模式。擴充套件是一種靜態行為,對被擴充套件的類 本身不會造成任何影響。擴充套件函式可以在已有類中新增新的方法,不會對原類做修改,擴充套件函式定義形式 ...