【发布时间】:2021-10-21 08:15:36
【问题描述】:
我有一个场景,我有一个超级抽象类,它使用 Kotlin sealed classes 发出不同类型的事件。
这些事件的建模如下。
sealed class BaseEvent {
object ConnectionStarted : BaseEvent()
object ConnectionStopped : BaseEvent()
}
sealed class LegacyEvent : BaseEvent() {
object TextChanged : LegacyEvent()
object TextCleared : LegacyEvent()
}
sealed class AdvancedEvent : BaseEvent() {
object ButtonClick : AdvancedEvent()
object ButtonLongClick : AdvancedEvent()
}
这里是发出这些事件的类
abstract class BaseViewModel<E : BaseEvent> {
private fun startConnection() {
emit(BaseEvent.ConnectionStarted) // <-- Error
}
fun emit(event: E){
//...
}
}
class LegacyBaskan : BaseViewModel<LegacyEvent>() {
fun textChanged() {
emit(LegacyEvent.TextChanged) // <-- Works
}
}
class AdvancedBaskan : BaseViewModel<AdvancedEvent>() {
fun buttonClicked() {
emit(AdvancedEvent.ButtonClick) // <-- Works
}
}
在这里,它仅适用于子类,我可以在其关联类中的 LegacyEvent 或 AdvancedEvent 中发出任何事件。但是,对于BaseBaskan 类,我不能从BaseEvent 发出事件,尽管我声明泛型类型E 必须扩展BaseEvent。
我需要每个子类都可以访问它自己的事件以及超类事件,但不能访问其他子类的事件。
我怎样才能仍然从基类中的BaseEvent 发出事件,同时让每个类只能发出自己的事件?
【问题讨论】:
标签: kotlin generics sealed-class