Android Kotlin Mvp类授权

时间:2016-10-06 10:14:59

标签: android kotlin

所以我有以下情况:

  class NowActivity: AppCompatActivity(), NowScreen, NowDelegate by NowDelegateImpl(){

  onCreate(...){
       presenter.attachView(this)
  }

有没有办法可以将一些NowScreen方法的实现委托给NowDelegate,这样我就可以在演示者中执行以下操作:

view.callSomeFunc()

其中callSomeFund()在NowDelegate

中实现

有没有办法完成这样的事情?问题是我正在使用MVP,它将视图附加到演示者。但是在一些活动中重复了一些视图实现,所以我想将它委托给另一个类。

1 个答案:

答案 0 :(得分:3)

如果它实现了两个接口,您可以将两个接口委派给同一个对象。为此,只需将对象设为构造函数参数,例如:

class NowActivity(delegate: NowDelegateImpl): AppCompatActivity(), 
                        NowScreen by delegate, 
                        NowDelegate by delegate {
   constructor (): this(NowDelegateImpl()) {}  // need this default constructor for Android to call
... 
}

如果委托没有实现两个接口的所有内容,您可以将其作为成员并手动将某些功能子集委托给它。

class NowActivity(private val delegate: NowDelegateImpl): 
                       AppCompatActivity(), 
                       NowScreen,
                       NowDelegate by delegate {
   constructor (): this(NowDelegateImpl()) {}  // need this default constructor for Android to call
   override fun callSomeFund() { delegate.callSomeFund() }
}

这两个选项都需要您创建一个默认构造函数,该构造函数创建用于委派的对象并将其传递给主构造函数。

这里有一个全面的示例,它不是Android特定的,以防其他人想要看到所有正在发生的事情......

示例1,将所有接口委托给同一个对象:

interface CommonStuff {
    fun foo1()
    fun foo2()
}

interface LessCommonStuff {
    fun bar()
}

class CommonDelegate1: CommonStuff, LessCommonStuff {
    override fun foo1() {}
    override fun foo2() {}
    override fun bar() {}
}

class Activity1(delegate: CommonDelegate1): 
                          LessCommonStuff by delegate,
                          CommonStuff by delegate {
   constructor (): this(CommonDelegate1()) {}  // need this default constructor
   // ...
}

示例2,使用成员手动委派一些接口:

interface CommonStuff {
    fun foo1()
    fun foo2()
}

interface LessCommonStuff {
    fun bar()
}

class CommonDelegate2: CommonStuff {
    override fun foo1() {}
    override fun foo2() {}
    fun barLikeThing() {}
}

class Activity2(private val delegate: CommonDelegate2): 
                     LessCommonStuff,
                     CommonStuff by delegate {
    constructor (): this(CommonDelegate2()) {}  // need this default constructor
    override fun bar() { delegate.barLikeThing() }
}