Kotlin 的单例,枚举以及印章类

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

运行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值