我有一个名为 presenter 的抽象类:
abstract class Presenter<V> {
fun bind(view: V) {
...
}
...
}
我有这些演示者的实现:
class FolderChooserPresenter : Presenter<FolderChooserView>() {
...
}
查看指定点调用bind方法的类:
class FolderChooserActivity : BaseView(), FolderChooserView {
@Inject lateinit var presenter: FolderChooserPresenter
// method of baseview
override fun onStart() {
super.onStart()
presenter.bind(this)
}
}
我想要实现的是为像 FolderChooserActivity
这样的类创建一个基类,它会自动调用绑定(bind)方法。
在所有实现中一遍又一遍地重复这些调用感觉很愚蠢。
我的方法是使用一个抽象类来扩展调用绑定(bind)方法的 BaseView
。但这显然行不通,因为绑定(bind)类需要实现而不是抽象类。
最佳答案
您可以将两个通用参数添加到您的 BaseView
类,并将 this
转换为 V
:
open class Presenter<V> {
fun bind(v: V) {}
}
open class BaseView<P, V> where P : Presenter<V> {
lateinit var presenter: P
fun onStart() {
p.bind(this as V)
}
}
你会像这样使用它
class FolderPresenter : Presenter<FolderChooserView>() {
}
class FolderChooserView : BaseView<FolderPresenter, FolderChooserView>()
不幸的是,由于未经检查的转换,如果混淆了参数,您将无法从编译器获得任何帮助:
class SomeOtherView : BaseView<SomeOtherPresenter, FolderChooserView>()
关于泛型:抽象类和子类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34526021/