我使用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.OutcomingTextMVH
和Lib.OutcomingTextMVH
都继承自Lib.IncomingTextMVH
。
答案 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
复制所有属性,但与以前一样,所有绑定逻辑都放在单个方法中,所有属性初始化一次。