通常要對乙個類進行擴充套件,可以使用繼承或者設計模式如裝飾者模式,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模式。擴充套件是一種靜態行為,對被擴充套件的類 本身不會造成任何影響。擴充套件函式可以在已有類中新增新的方法,不會對原類做修改,擴充套件函式定義形式 ...