gpt4 book ai didi

安卓/ Kotlin : Composing different Activity "traits" into one activity

转载 作者:行者123 更新时间:2023-12-02 20:36:26 26 4
gpt4 key购买 nike

我正在寻找一种在 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 Trait 既不等同于 Kotlin 抽象类,也不等同于 Kotlin 接口(interface)。

Kotlin 的委托(delegate)似乎也不可能。我还考虑过使用泛型,在我有限的想象力中,它可能看起来像这样:

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 生命周期处理 Lyfecycle 事件

这并不完整,也几乎没有什么功能,但我希望它能为您清除一些东西。

关于安卓/ Kotlin : Composing different Activity "traits" into one activity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59519088/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com