创建2个不同子类

时间:2018-01-11 01:17:16

标签: generics kotlin

我使用Android库要求我创建2个类, 每个都继承自不同的类。
(有一个共同的基类)

现在我有了这段代码:

class IncomingFileMVH(itemView: View):
Lib.IncomingTextMVH(itemView) {

    private val tv: TextView = itemView.findViewById(R.id.text)

    override fun onBind(message: ChatMessage) {
        super.onBind(message)
        tv.text = message.text
    }
}

我必须复制此类才能创建扩展OutcomingFileMVH的{​​{1}},即使我的两个类共享完全相同的代码。

我简化了示例的代码,但重复可能很重要 我决定将我的代码放在这两个类之外的静态方法中, 并在类重写方法中调用它们,但我认为必须有一种更清晰的方法来执行此操作。

你能帮我解决这个问题吗?

Lib.OutcomingTextMVHLib.OutcomingTextMVH都继承自Lib.IncomingTextMVH

1 个答案:

答案 0 :(得分:0)

我看到一个解决方案,但如果onBind多次调用,则可能效率不高。将此代码放在一个文件中,以确保共享逻辑不会在其他任何地方公开:

class IncomingFileMVH(itemView: View):
Lib.IncomingTextMVH(itemView) {

    override fun onBind(message: ChatMessage) {
        super.onBind(message)
        bind(message) //Import extension method from Shared
    }
}

class OutcomingFileMVH(itemView: View):
Lib.OutComingTextMVH(itemView) {

    override fun onBind(message: ChatMessage) {
        super.onBind(message)
        bind(message)
    }
}

private object Shared {

    val Lib.BaseMVH.tv: TextView
        get() = itemView.findViewById(R.id.text)

    fun Lib.BaseMVH.bind(message: ChatMessage) {
        tv.text = message.text
    }
}

粗略地说这里的问题是我们无法在扩展属性中存储任何值。因此,每次调用onBind时,它也会调用itemView.findViewById(R.id.text)

还有另一种我更喜欢的解决方案。为属性创建契约接口,为两个类实现它,并为onBind()

创建帮助器扩展方法
private interface Base {

    val tv: TextView
}

class IncomingFileMVH(itemView: View):
Lib.IncomingTextMVH(itemView), Base {

    override val tv: TextView = itemView.findViewById(R.id.text)

    override fun onBind(message: ChatMessage) {
        super.onBind(message)
        bind(message)
    }
}

class OutcomingFileMVH(itemView: View):
Lib.OutComingTextMVH(itemView), Base {

    override val tv: TextView = itemView.findViewById(R.id.text)

    override fun onBind(message: ChatMessage) {
        super.onBind(message)
        bind(message)
    }
}

private fun Base.bind(message: ChatMessage) {
    tv.text = message.text
}

是的,您需要使用View复制所有属性,但与以前一样,所有绑定逻辑都放在单个方法中,所有属性初始化一次