kotlin 可以對乙個類的屬性和方法進行擴充套件,且不需要繼承或使用 decorator 模式。
擴充套件是一種靜態行為,對被擴充套件的類**本身不會造成任何影響。
擴充套件函式可以在已有類中新增新的方法,不會對原類做修改,擴充套件函式定義形式:
fun receivertype以下例項擴充套件 user 類 :.functionname
(params
)
class例項執行輸出結果為:user
(var
name
:string
)/**擴充套件函式**/
fun
user
()fun main
(arg
:array
<
string
>)
使用者名稱下面**為 mutablelist 新增乙個swap 函式:runoob
// 擴充套件函式 swap,調換不同位置的值例項執行輸出結果為:fun
mutablelist
<
int>.
swap
(index1
:int
,index2
:int
)fun main
(args
:array
<
string
>)
[3,this關鍵字指代接收者物件(receiver object)(也就是呼叫擴充套件函式時, 在點號之前指定的物件例項)。2,1]
擴充套件函式是靜態解析的,並不是接收者型別的虛擬成員,在呼叫擴充套件函式時,具體被呼叫的的是哪乙個函式,由呼叫函式的的物件表示式來決定的,而不是動態的型別決定的:
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擴充套件屬性允許定義在類或者kotlin檔案中,不允許定義在函式中。初始化屬性因為屬性沒有後端字段(backing field),所以不允許被初始化,只能由顯式提供的 getter/setter 定義。<
t>
list
<
t>.
lastindex
:int
get()
=size -1
val擴充套件屬性只能被宣告為 val。foo.
bar =1
// 錯誤:擴充套件屬性不能有初始化器
如果乙個類定義有乙個伴生物件 ,你也可以為伴生物件定義擴充套件函式和屬性。
伴生物件通過"類名."形式呼叫伴生物件,伴生物件宣告的擴充套件函式,通過用類名限定符來呼叫:
class例項執行輸出結果為:myclass
// 將被稱為 "companion"
}fun
myclass
.companion
.foo
()val
myclass
.companion.no
:int
get()=10
fun main
(args
:array
<
string
>)")
myclass
.foo
()}
no:10通常擴充套件函式或屬性定義在頂級包下:伴隨物件的擴充套件函式
package要使用所定義包之外的乙個擴充套件, 通過import匯入擴充套件的函式名進行使用:foo.
barfun
baz.
goo()
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 類內,建立了 d 類的擴充套件。此時,c 被成為分發接受者,而 d 為擴充套件接受者。從上例中,可以清楚的看到,在擴充套件函式中,可以呼叫派發接收者的成員函式。c baz
假如在呼叫某乙個函式,而該函式在分發接受者和擴充套件接受者均存在,則以擴充套件接收者優先,要引用分發接收者的成員你可以使用限定的 this 語法。
classd }例項執行輸出結果為:class
c // 與 d 類 的 bar 同名
fun d
.foo
()fun
caller(d
:d)}
fun main
(args
:array
<
string
>)
d bar以成員的形式定義的擴充套件函式, 可以宣告為 open , 而且可以在子類中覆蓋. 也就是說, 在這類擴充套件函式的派 發過程中, 針對分發接受者是虛擬的(virtual), 但針對擴充套件接受者仍然是靜態的。c bar
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模式。擴充套件是一種靜態行為,對被擴充套件的類 本身不會造成任何影響。擴充套件函式可以在已有類中新增新的方法,不會對原類做修改,擴充套件函式定義形式 ...