单例关键字: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)
}
}
运行结果