所以我有以下情况:
class NowActivity: AppCompatActivity(), NowScreen, NowDelegate by NowDelegateImpl(){
onCreate(...){
presenter.attachView(this)
}
有没有办法可以将一些NowScreen
方法的实现委托给NowDelegate,这样我就可以在演示者中执行以下操作:
view.callSomeFunc()
其中callSomeFund()在NowDelegate
。
有没有办法完成这样的事情?问题是我正在使用MVP,它将视图附加到演示者。但是在一些活动中重复了一些视图实现,所以我想将它委托给另一个类。
答案 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() }
}