Kotlin泛型:实现MVP的接口
在下面的例子中,我明白BaseActivity不能作为presenter.onAttached
的参数presenter.onAttached
,尽管它实现了与V类似的BaseView接口。实现的Presenter可能被提供了BaseView的一个子类,例如MainPresenter<MainView>
,这意味着BaseView不够具体。
abstract class BaseActivity<V : BaseView, out P : BasePresenter<V>> : AppCompatActivity(), BaseView { abstract val presenter : P override fun onCreate(savedInstanceState: Bundle?) { ... presenter.onAttached(this) // Type mismatch } }
但是,我仍然需要通过参考实施活动来告诉演讲者其观点是什么。 理想情况下,我可以从Base类中完成所有这些工作,这样MVP实现细节对于实现类几乎是不可见的。
我已经找到了两种方法来做到这一点,但他们有他们的问题:
1.我可以让每个执行活动都覆盖一个V
字段,但是每一个执行活动都会有相同的代码行! 锅炉多? 它似乎也不符合泛型的精神。
// base abstract val view : V override fun onCreate(savedInstanceState: Bundle?) { ... presenter.onAttached(view) } // impl override val view = this
我可以假设this
总是一个V
并忽略lint错误。 然而这是危险的,并且不符合泛型的精神。
presenter.onAttached(this as V)
Kotlin有没有一种性感的方式呢? 某种约束,所有扩展BaseActivity的类都必须实现某种BaseView?