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