我正在寻找一种方法来结合不同的功能在Android活动,应该是可重用的不同的活动类。具体地说,这个问题是由于覆盖了开放方法而引起的,在开放方法中也必须调用超级的实现。
open class FirstActivity : FragmentActicity() {
override fun onStart() {
super.onStart()
doSomething()
}
}这很简单,但它不能重用。例如,我可能希望使用不同的基本活动类具有相同的行为:
open class SecondActivity : AppCompatActivity() {
override fun onStart() {
super.onStart()
doSomething()
}
}在那里我必须复制代码。如果我有一个非常基本的功能,比如跟踪活动的状态,我会或多或少地希望我的所有活动都有不同的基类。当我想要创建更多可以组合的特性时,情况会变得更糟:
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接口。
对于Kotlin的代表来说,这似乎也不可能。我还考虑过使用泛型,在我有限的想象力中可能是这样的:
open class FirstActivity<BaseActivity : Activity> : BaseActivity() {
...
}当然这也是不可能的。
有什么我没注意到的吗?用Dagger可以做到吗?
发布于 2020-01-23 05:03:22
你在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事件
这篇文章并不完整,功能也不强,但我希望它能帮你弄清楚一些东西。
https://stackoverflow.com/questions/59519088
复制相似问题