首页 文章

创建2个不同子类的相同类

提问于
浏览
0

我使用一个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
    }
}

我必须复制这个类来创建一个扩展 Lib.OutcomingTextMVHOutcomingFileMVH ,即使我的两个类共享完全相同的代码 .

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

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

Lib.OutcomingTextMVHLib.IncomingTextMVH 都从 Lib.BaseMVH 继承 .

1 回答

  • 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) .

    还有另一种我更喜欢的解决方案 . 为属性创建 Contract 接口,为两个类实现它,并为 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 复制所有属性,但是像以前一样,所有绑定逻辑都放在单个方法和 all properties initialized once 中 .

相关问题