为了在父类中获取子类类型,通过泛型来实现
/**
* 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()
}