微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

泛型模拟Scala的SelfType

/**
 * Created by FangJu on 2020/1/31
 */
typealias OnConfirm = () -> Unit

typealias OnCancel = () -> Unit

private val EmptyFunction = {}

open class Notification(
    val title: String,
    val content: String
)

class ConfirmNotification(title: String, content: String, val onConfirm: OnConfirm, val onCancel: OnCancel) :
    Notification(title, content) {

}

interface SelfType<Self> {
    val self: Self
        get() = this as Self
}

open class NotificationBuilder<Self : NotificationBuilder<Self>> : SelfType<Self> {
    protected var title: String = ""
    protected var content: String = ""

    fun title(title: String): Self {
        this.title = title
        return self
    }

    fun content(content: String): Self {
        this.content = content
        return self
    }

    open fun build(): Notification {
        return Notification(title, content)
    }
}

class ConfirmNotificationBuilder : NotificationBuilder<ConfirmNotificationBuilder>() {
    protected var onConfirm: OnConfirm = EmptyFunction
    protected var onCancel: OnCancel = EmptyFunction

    fun onConfirm(onConfirm: OnConfirm): ConfirmNotificationBuilder {
        this.onConfirm = onConfirm
        return this
    }

    fun onCancel(onCancel: OnCancel): ConfirmNotificationBuilder {
        this.onCancel = onCancel
        return this
    }

    override fun build(): ConfirmNotification {
        return ConfirmNotification(title, content, onConfirm, onCancel)
    }
}

fun main() {
    ConfirmNotificationBuilder()
        .title("修改名字")
        .content("内容")
        .onCancel {
            println("onCancel")
        }
        .onConfirm {
            println("onConfirm")
        }
        .build()
        .onCancel()
}

老头儿ii 发布了113 篇原创文章 · 获赞 19 · 访问量 1万+ 私信 关注

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐