#android #kotlin
#Android #kotlin
Вопрос:
Итак, у меня следующий сценарий:
class NowActivity: AppCompatActivity(), NowScreen, NowDelegate by NowDelegateImpl(){
onCreate(...){
presenter.attachView(this)
}
Могу ли я каким-либо образом делегировать реализацию некоторых NowScreen
методов NowDelegate, чтобы я мог выполнить следующие действия внутри докладчика:
view.callSomeFunc()
в котором реализован callSomeFund() NowDelegate
.
Есть ли какой-нибудь способ выполнить что-то подобное? проблема в том, что я использую MVP, который прикрепляет представление к презентатору. Но часть реализации представления повторяется в нескольких действиях, поэтому я хотел бы делегировать его другому классу.
Ответ №1:
Вы можете делегировать оба интерфейса одному и тому же объекту, если он реализует оба интерфейса. Для этого просто сделайте объект параметром конструктора, например:
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() }
}
Комментарии:
1. как насчет действий, не имеющих конструктора… можете ли вы это сделать?
2. что вы имеете в виду, что у него нет конструктора, который создает действие?
3. @user3806331 хорошо, исправил мой ответ, добавив конструктор по умолчанию, который вызывает другой конструктор