我正在寻找一种在Android Activity 中组合不同功能的方法,该功能应可用于不同 Activity 类。具体来说,问题是由覆盖开放方法引起的,在覆盖方法中还必须调用super的实现。

open class FirstActivity : FragmentActicity() {
  override fun onStart() {
    super.onStart()
    doSomething()
  }
}

这很简单,但是不可重用。我可以例如希望在不同的基本 Activity 类中具有相同的行为:
open class SecondActivity : AppCompatActivity() {
  override fun onStart() {
    super.onStart()
    doSomething()
  }
}

我必须在其中复制代码。如果我有一个非常基本的功能(例如跟踪 Activity 的状态),那么我会希望在几乎所有具有不同基类的 Activity 中都使用它。
当我想创建更多可以组合的功能时,情况就更糟了:
open class ThirdActivity : FragmentActivity() {
  override fun onResume() {
    super.onResume()
    doSomeResuming()
  }
}

open Class FirstActivityAgain : ThirdActivity {
  override fun onStart() {
    super.onStart()
    doSomething()
  }
}

class MyFragmentActivity : FirstActivity() {
  override fun onStop() {
    doSomethingElse()
    super.onStop()
  }
}

class MyFragmentActivityWithResuming : FirstActivityAgain() {
  override fun onStop() {
    doSomethingElse()
    super.onStop()
  }
}

class MyTopBarActivity : SecondActivity() {
  override fun onStop() {
    doSomethingElse()
    super.onStop()
  }
}



In Scala I can use Traits可以执行此stackable modification,它允许非常灵活的功能混合。甚至有可能一遍又一遍地修改相同的方法,只需要小心linearization order即可。
在Kotlin中,这是不可能的,因为Scala特性既不等同于Kotlin抽象类,也不等同于Kotlin接口(interface)。

Kotlin的代表似乎也不可能。我还考虑过使用泛型,在我有限的想象中,它可能像这样:
open class FirstActivity<BaseActivity : Activity> : BaseActivity() {
  ...
}

当然这也是不可能的。

有什么我忽略的东西吗?可以使用Dagger完成吗?

最佳答案

您在Kotlin中所指的是interfaces和一些基本的delegation

interface Base {
    fun printMessage()
    fun printMessageLine()
}

class BaseImpl(val x: Int) : Base {
    override fun printMessage() { print(x) }
    override fun printMessageLine() { println(x) }
}

class Derived(b: Base) : Base by b {
    override fun printMessage() { print("abc") }
}

fun main() {
    val b = BaseImpl(10)
    Derived(b).printMessage()
    Derived(b).printMessageLine()
}

尽管它无法挽救super问题,但因为它是Android框架问题,而不是Kotlin语言。

对于您的情况,我会做类似的事情
interface BaseActivityContainer{
 var activity: Activity
}

class MainActivity: BaseActivityContainer{

override var activity: Activity = this

}

interface BaseDoable: BaseActivityContainer{

fun doActivityStuff(){
 activity.getString(...)
}

}

interface BaseDoableSecond: BaseActivityContainer{

fun doActivityStuff(){
 activity.getDrawable(...)
}

}

class SomeActivity: MainActivity, BaseDoableSecond by this

借助Android Lifecycle处理Lyfecycle事件

这还不完整,几乎没有功能,但是我希望它能为您清除一些内容。

09-11 19:45
查看更多