【问题标题】:Kotlin & Generic delegates, how to switch between subclassesKotlin & Generic 委托,如何在子类之间切换
【发布时间】:2019-08-17 20:03:51
【问题描述】:

我遇到了一个问题,希望得到您对此的反馈,尤其是如何正确处理以下情况:

我有一个定义委托的抽象类:

abstract class Delegate<T: Any> {
    abstract fun bindData(item: T?)
}

然后我有这个委托的 2 个实现:

class DelegateForObjectA: Delegate<A>() {
    var data: A? = null

    override fun bindData(item: A?){
        data = item
    }
}

class DelegateForObjectB: Delegate<B>() {
    var data: B? = null

    override fun bindData(item: B?) {
        data = item
    }
}

我希望能够在这 2 个代表之间动态切换,这意味着在我的活动中我有:

lateinit var delegate: ActionButtonsViewDelegate<*>
private var delegateA by lazy { DelegateForObjectA() }
private var delegateB by lazy { DelegateForObjectB() }

init {
    delegate = delegateA
}

然后:

fun SwitchDelegateAndBindData(item: Any?) {
    if (item is B) {
        delegate = delegateB
    } else {
        delegate = delegateA
    }

    delegate.bindData(item)
}

我尝试通过输入/输出来实现这一点,但没有成功!如何声明我的委托属性以接受两个委托而不会在类型上发生冲突?

【问题讨论】:

  • A 和 B 这里是实际的类名,还是参数?如果它们是实际的类名,那么你不需要用它们参数化你的子类:DelegateForObjectA : Delegate&lt;A&gt;,而不是DelegateForObjectA&lt;A&gt; : Delegate&lt;A&gt;。 (不确定这是否会影响主要问题。)
  • 嗯,你说得对,它是一种类型!代码是 DelegateForObjectA : Delegate
  • 显示什么错误?

标签: generics kotlin delegates


【解决方案1】:

我找到了一种让它工作的方法,虽然我不确定它为什么工作以及它是否真的适合你的需求^^'

/**
 * You can edit, run, and share this code. 
 * play.kotlinlang.org 
 */

fun main() {
    val a = A()
    val b = B()
    val test = Test()

    test.switchDelegate(a)
    test.switchDelegate(b)
    test.switchDelegate(a)
}

class Test {
    var delegate: Delegate<*>
    private val delegateA by lazy { DelegateForObjectA() }
    private val delegateB by lazy { DelegateForObjectB() }

    init {
        delegate = delegateA
    }

    fun switchDelegate(item: Any) {
        if (item is B) {
            delegate = delegateB
        } else {
            delegate = delegateA
        }
        delegate.bindData( item )
    }
}

abstract class Delegate<T> {
    abstract fun <T:Any> bindData(item : T)
}

class A {}

class B {}

class DelegateForObjectA: Delegate<A>() {
    override fun <A:Any> bindData(item: A){
        println( "Binding A" )
    }
}

class DelegateForObjectB: Delegate<B>() {
    override fun <B:Any> bindData(item: B) {
        println( "Binding B" )
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-07
    • 2018-03-30
    • 1970-01-01
    • 1970-01-01
    • 2011-09-15
    • 1970-01-01
    相关资源
    最近更新 更多