Kotlin 擴充套件

2021-10-23 12:37:55 字數 3868 閱讀 4740

伴生物件的擴充套件

擴充套件的作用域

擴充套件宣告為成員

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

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

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

fun receivertype.

functionname

(params)

class

user

(var name:string)

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

fun user.

print()

funmain

(arg:array

)

例項執行輸出結果為:

使用者名稱 csdn
下面**為mutablelist新增乙個swap函式:

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

fun mutablelist

.swap

(index1: int, index2: int)

funmain

(args: array

)

結果:

[3,

2,1]

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

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

open

class c

class d:c(

)fun c.

foo()=

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

fun d.

foo()=

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

funprintfoo

(c: c)

funmain

(arg:array

)

結果:

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

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

fun any?

.tostring()

: string

funmain

(arg:array

)

結果:

null
擴充套件屬性

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

val

list

.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()

=10funmain

(args: array)"

) myclass.

foo(

)}

結果:

no:

10伴隨物件的擴充套件函式

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

package foo.bar

fun baz.

goo(

)

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

package com.example.usage

import foo.bar.goo // 匯入所有名為 goo 的擴充套件

// 或者

import foo.bar.

*// 從 foo.bar 匯入一切

funusage

(baz: baz)

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

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

class d 

}class c

fun d.

foo(

)fun

caller

(d: d)

}fun

main

(args: array

)

結果:

d bar

c baz

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

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

class d 

}class c

// 與 d 類 的 bar 同名

fun d.

foo(

)fun

caller

(d: d)

}fun

main

(args: array

)

結果:

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()}

funmain

(args: array

)

結果:

d.foo in c

d.foo in c1

d.foo in c

kotlin 擴充套件

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

Kotlin 擴充套件

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

(九)kotlin擴充套件

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