我正在寻找一种在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事件
这还不完整,几乎没有功能,但是我希望它能为您清除一些内容。