Делегация класса Kotlin Mvp для Android

Поэтому у меня есть следующий сценарий:

class NowActivity: AppCompatActivity(), NowScreen, NowDelegate by NowDelegateImpl(){ onCreate(...){ presenter.attachView(this) } 

Можно ли каким-либо образом делегировать реализацию некоторых методов NowScreen для NowDelegate, поэтому я могу сделать следующее внутри ведущего:

 view.callSomeFunc() 

в котором callSomeFund () реализован в NowDelegate .

Есть ли способ сделать что-то подобное? проблема в том, что я использую MVP, который прикрепляет представление к ведущему. Но некоторые из реализаций представления повторяются в нескольких действиях, поэтому я хочу делегировать их другому классу.

Вы можете делегировать оба интерфейса одному и тому же объекту, если он реализует оба интерфейса. Для этого просто сделайте объект конструктором, например:

 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() } }