首页 > 解决方案 > 如何使用我的 BasePresenter 扩展所有视图

问题描述

我正在处理一个项目并对其进行 mvp,现在,我有一个用于所有活动的 BaseActivity 和一个与我所在的活动视图一起工作的 BasePresenter,这样做是为了附加、分离和知道我的视图在哪里与我的演示者一起工作时是否为 null。

现在,这对于我的第一个视图来说效果很好

abstract class BasePresenter<T : LoginContract.View> : Presenter<T> {

    private var mMvpView: T? = null

    val isViewAttached: Boolean
        get() = mMvpView != null

    override fun attachView(view: T) {
        mMvpView = view
    }

    override fun detachView() {
        mMvpView = null
    }
}

在我的主持人中,我这样称呼它

class LoginPresenter: BasePresenter<LoginContract.View>(), LoginContract.Presenter {

....

但是现在,我正在创建一个名为RegisterPresenter的新演示者,当我使用 BasePresenter<> 使用演示者扩展我的课程时,它要求放入LoginContract.View其中。

我知道因为这里是这样编码的

abstract class BasePresenter<T : LoginContract.View> : Presenter<T> {
...

但我想知道是否有一种方法可以像这样扩展多个视图

abstract class BasePresenter<T : multipleViews> : Presenter<T> {

标签: androiddesign-patternskotlinmvp

解决方案


您不能扩展多个类。您应该改用一些基本接口。

你怎么能做到这一点

  1. Base Presenter 可以使用一些BaseView接口:
abstract class BasePresenter<T : BaseView> : Presenter<T>

LoginContract.View接口应该扩展BaseViewRegisterContract.View也应该延长BaseView

  1. 然后,如果您需要一个适用于所有视图的通用演示者,您需要创建通用界面:
interface AllViews: LoginContract.View, RegisterContract.View
  1. 现在您可以在 GeneralPresenter 中使用它
class GeneralPresenter : BasePresenter<AllView>

推荐阅读