如何创建继承抽象的匿名对象的新实例?

问题描述 投票:0回答:1

我最初在使用这个旧的时有这段代码,这里的想法是支持数据中存在多个表标签然后在 TextView 中渲染多个表跨度的场景。要获取 onclick 事件,它使用

newInstance()
方法。

htmlTxtV.setClickableTableSpan(ClickableTableSpanImpl(intentDomain))

inner class ClickableTableSpanImpl(private val intentDomain: WordPressPostDataDomain) :
        ClickableTableSpan() {

        override fun newInstance(): ClickableTableSpan {
            return ClickableTableSpanImpl(intentDomain)
        }

        override fun onClick(widget: View) {
            // Do task here
        }

    }

如果我将其转换为匿名对象

setClickableTableSpan(object : ClickableTableSpan() {

                    override fun newInstance(): ClickableTableSpan {
                        return this
                    }

                    override fun onClick(widget: View) {
                        // Do task here
                    }

                })

我只从最后一个跨度得到单个回调。这意味着

return this
不等于
return ClickableTableSpanImpl()
。是否可以仅使用匿名对象来创建新实例?

kotlin
1个回答
0
投票

您基于

inner class
的方法本身就很好。如果您只是想“了解更多有关该语言的可能性”,也可以声明这样的局部函数:

fun main() {
    fun clickableTableSpan(): ClickableTableSpan = object: ClickableTableSpan {
        override fun newInstance(): ClickableTableSpan {
            return clickableTableSpan()
        }

        // ...
    }

    setClickableTableSpan(clickableTableSpan())
}

如果您想在单个表达式中执行此操作,您可以将整个事情包装到立即调用的 lambda 表达式中。

setClickableTableSpan({
        fun clickableTableSpan(): ClickableTableSpan = object: ClickableTableSpan {
            override fun newInstance(): ClickableTableSpan {
                return clickableTableSpan()
            }
        }
        clickableTableSpan()
    }())

但是在我看来,

inner class
更具可读性。

© www.soinside.com 2019 - 2024. All rights reserved.