(九)kotlin擴充套件

2021-08-15 20:18:26 字數 4171 閱讀 3295

kotlin 可以對乙個類的屬性和方法進行擴充套件,且不需要繼承或使用 decorator 模式。

擴充套件是一種靜態行為,對被擴充套件的類**本身不會造成任何影響。

擴充套件函式可以在已有類中新增新的方法,不會對原類做修改,擴充套件函式定義形式:

fun receivertype

.functionname

(params

)

以下例項擴充套件 user 類 :

class

user

(var

name

:string

)/**擴充套件函式**/

fun

user

.print

()fun main

(arg

:array

<

string

>)

例項執行輸出結果為:

使用者名稱

runoob

下面**為 mutablelist 新增乙個swap 函式:

// 擴充套件函式 swap,調換不同位置的值

fun

mutablelist

<

int>.

swap

(index1

:int

,index2

:int

)fun main

(args

:array

<

string

>)

例項執行輸出結果為:

[3,

2,1]

this關鍵字指代接收者物件(receiver object)(也就是呼叫擴充套件函式時, 在點號之前指定的物件例項)。

擴充套件函式是靜態解析的,並不是接收者型別的虛擬成員,在呼叫擴充套件函式時,具體被呼叫的的是哪乙個函式,由呼叫函式的的物件表示式來決定的,而不是動態的型別決定的:

open 

class

cclassd:

c()fun c

.foo()=

"c"// 擴充套件函式 foo

fun d

.foo()=

"d"// 擴充套件函式 foo

fun printfoo(c

:c)fun main

(arg

:array

<

string

>)

例項執行輸出結果為:

c
若擴充套件函式和成員函式一致,則使用該函式時,會優先使用成員函式。

classc }

fun c

.foo

()fun main

(arg

:array

<

string

>)

例項執行輸出結果為:

成員函式
在擴充套件函式內, 可以通過 this 來判斷接收者是否為 null,這樣,即使接收者為 null,也可以呼叫擴充套件函式。例如:

fun 

any?.

tostring

():string

fun main

(arg

:array

<

string

>)

例項執行輸出結果為:

null
>擴充套件屬性

除了函式,kotlin 也支援屬性對屬性進行擴充套件:

val 

<

t>

list

<

t>.

lastindex

:int

get()

=size -1

擴充套件屬性允許定義在類或者kotlin檔案中,不允許定義在函式中。初始化屬性因為屬性沒有後端字段(backing field),所以不允許被初始化,只能由顯式提供的 getter/setter 定義。

val 

foo.

bar =1

// 錯誤:擴充套件屬性不能有初始化器

擴充套件屬性只能被宣告為 val。

如果乙個類定義有乙個伴生物件 ,你也可以為伴生物件定義擴充套件函式和屬性。

伴生物件通過"類名."形式呼叫伴生物件,伴生物件宣告的擴充套件函式,通過用類名限定符來呼叫:

class

myclass

// 將被稱為 "companion"

}fun

myclass

.companion

.foo

()val

myclass

.companion.no

:int

get()=10

fun main

(args

:array

<

string

>)")

myclass

.foo

()}

例項執行輸出結果為:

no:10

伴隨物件的擴充套件函式

通常擴充套件函式或屬性定義在頂級包下:

package

foo.

barfun

baz.

goo()

要使用所定義包之外的乙個擴充套件, 通過import匯入擴充套件的函式名進行使用:

package

com.

example

.usage

import

foo.

bar.

goo

// 匯入所有名為 goo 的擴充套件

// 或者

import

foo.

bar.*

// 從 foo.bar 匯入一切

fun usage

(baz

:baz

)

在乙個類內部你可以為另乙個類宣告擴充套件。

在這個擴充套件中,有個多個隱含的接受者,其中擴充套件方法定義所在類的例項稱為分發接受者,而擴充套件方法的目標型別的例項稱為擴充套件接受者。

classd }

class

c fun d

.foo

()fun

caller(d

:d)}

fun main

(args

:array

<

string

>)

例項執行輸出結果為:

d bar

c baz

在 c 類內,建立了 d 類的擴充套件。此時,c 被成為分發接受者,而 d 為擴充套件接受者。從上例中,可以清楚的看到,在擴充套件函式中,可以呼叫派發接收者的成員函式。

假如在呼叫某乙個函式,而該函式在分發接受者和擴充套件接受者均存在,則以擴充套件接收者優先,要引用分發接收者的成員你可以使用限定的 this 語法。

classd }

class

c // 與 d 類 的 bar 同名

fun d

.foo

()fun

caller(d

:d)}

fun main

(args

:array

<

string

>)

例項執行輸出結果為:

d bar

c bar

以成員的形式定義的擴充套件函式, 可以宣告為 open , 而且可以在子類中覆蓋. 也就是說, 在這類擴充套件函式的派 發過程中, 針對分發接受者是虛擬的(virtual), 但針對擴充套件接受者仍然是靜態的。

open 

class

d class

d1 :d()

open

class

c open fun d1

.foo

()fun

caller(d

:d)}

class

c1 :c()

override

fun d1

.foo()}

fun main

(args

:array

<

string

>)

例項執行輸出結果為:

d

.foo inc

d.foo

inc1d.

foo

inc

kotlin 擴充套件

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

Kotlin 擴充套件

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

Kotlin 擴充套件

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