JAVA不同lib相同的类,创建2个不同子类的相同类

我看到一个解决方案,但如果 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 中 .

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值