單例關鍵字:object
我們在定義一個類時,使用object 替換 class 來修飾這個類,就表示,這是一個單例類
單例類作爲代理人時,不需要()
1、場景說明
小頭爸爸爲了增進父子感情,想和小頭兒子一起洗碗
3、代碼實現
(1)、小頭爸爸重寫接口方法 —— 未使用單例時的錯誤寫法
class SmallHeadFather:IWashBow by BigHeadSon(){
override fun washBow() {
println("我是小頭爸爸,我把洗碗事件委託給了大頭兒子")
BigHeadSon().washBow() //委託方重寫了事件之後,需要手動調用代理方的方法。但是,此處又通過()構建了一個小頭兒子對象,已經不再是我們初始委託的那個大頭兒子了。所以,此處是有問題的。
println("我是小頭爸爸,大頭兒子洗完碗之後,我賺了9元")
}
}
(2)、使用單例後的正確寫法:
大頭兒子單例類
object BigHeadSon:IWashBow { //單例關鍵字object,聲明爲單例類之後會立即在內存中創建單例對象,並一直存在
override fun washBow() {
println("我是大頭兒子,每次洗碗賺1元錢")
}
}
小頭爸爸委託事件給單例的大頭兒子
class SmallHeadFather:IWashBow by BigHeadSon{ //被委託方(即代理方)是單例類,不需要通過()構建對象
override fun washBow() {
println("我是小頭爸爸,雖然我把洗碗事件委託給了小頭兒子,但是我要和他一起洗碗")
BigHeadSon.washBow() //委託方重寫了事件之後,需要手動調用代理方的方法。由於 BigHeadSon是單例的,所以,這還是我們之前委託的那個兒子
println("我是小頭爸爸,我和小頭兒子洗完碗之後,我賺了9元")
}
}
(3)、外部調用
fun main(args: Array<String>) {
var father=SmallHeadFather()
father.washBow() //小頭爸爸已經將洗碗的操作委託爲小頭兒子了,但因爲重寫了洗完事件,所以,本子是調用的父親的洗完事件,父親的洗完事件中有一部分是自己做的,另一部分是兒子做的
}
(4)、輸出結果
枚舉–enum
枚舉示例代碼
enum class Week { //枚舉關鍵字 enum
星期一, 星期二, 星期三, 星期四, 星期五, 星期六, 星期天
}
fun main(args: Array<String>) {
println(Week.星期一)
println("${Week.星期一}在Week中的索引是${Week.星期一.ordinal}")
}
運行結果
印章類/密封類 (Sealed Class)
1、印章類的特點
子類類型有限的類成爲 印章類/密封類
印章類使用 sealed 作爲修飾符
印章類本身沒有構造方法
2、印章類與枚舉的區別
都是有限的數據
枚舉更注重具體的數據
印章類更注重數據的類型
3、印章類示例代碼
(1)、場景說明
假設你家有一頭公驢、一頭母驢、一頭公馬。那麼,
它們可能會生出一頭小驢,
也可能會生出一頭小騾子。
(2)、代碼示例
在上述場景中,由於他們能生出的兒子類型時固定的,所以,我們可以使用印章類來標識。
聲明印章類
sealed class Son { //使用 sealed 聲明 Son 爲印章類/密封類
class SmallMule() : Son() //聲明小騾子 SmallMule 爲 Son的子類。
class SmallDonkey() : Son() //聲明小驢子 SmallDonkey 爲 Son的子類
fun sayHello(son: Son) {
if (son is SmallMule) { //判斷是不是XX的實例的關鍵字 is
println("小騾子對大家說大家好")
} else if (son is SmallDonkey) {
println("小驢子對大家說大家好")
}
}
}
調用印章類
fun main(args: Array<String>) {
var mule = Son.SmallMule()
var donkey = Son.SmallDonkey()
var list = listOf<Son>(mule, donkey)
for (son in list) {
son.sayHello(son)
}
}
運行結果