当前位置: 首页 > 知识库问答 >
问题:

创建两个不同子类型的相同类

司寇昱
2023-03-14

我使用一个Android库,它要求我创建两个类,每个类继承自不同的类
(具有公共基类)

现在我有这个代码:

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的OutcomingFileMVH,即使我的两个类共享完全相同的代码。

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

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

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

共有1个答案

孙玮
2023-03-14

我看到了一种解决方案,但如果多次调用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复制所有属性,但是和以前一样,所有绑定逻辑都被放置到单个方法中,所有属性都初始化一次。

 类似资料:
  • 但是我有两种回购方式 如何创建两个bean,其中一个是用注入的,另一个是用注入的?

  • 我正在尝试构建一个CI流程,使用Travis CI从github自动将发布工件上传到Maven Central(Sonatype)。基本上,一切都很好,除了在最后;我从maven deploy命令中获得了两个不同的Nexus存储库:一个用于pom和jar;第二个是源代码、javadoc和签名。 我的猜测是,由于中间的元数据上传,他创建了两个存储库: 还我不明白为什么,以及如何修复它。 我的pom。

  • 我在Java中有两个几乎相同的方法。唯一的区别是它们有不同的参数类型。它们使用泛型并返回输入参数的类型T。我怎样才能摆脱重复的代码?下面是我的两个方法。最后,它们都使用不同的类型调用Spring。否则,方法是相同的。

  • 我有一个类,它有两个类似类型的字段。我嘲笑过他们两个。但是当我使用InjectMocks时,InjectMocks错误地将单个模拟注入到这两个字段中。 下面是示例代码类: 下面是我运行测试时的输出:testPrint()-intConsumer被注入到intConsumer和StringConsumer中。 我正在使用Maven。 我创建了这个私有构造函数,专门用于使用InjectMocks进行测

  • 我需要编写一个java方法来从一个对象中获取特定的信息。但是,该对象可以是A类型的,也可以是B类型的。下面是我的代码的一部分: 当我这样写它时,它会引发一个错误,说“重复方法”。我怎么才能让这个起作用?

  • 我想通过类型使用自动连接,以便在运行时容器注入适当的对象并调用适当的bean/method。 1.接口 2.头等舱 4.Rest课 5.application-context.xml 错误: