Kotlin - 接口中的只读属性

ale*_*pfx 5 android interface kotlin android-recyclerview readonly-variable

我有这个实用程序接口由 RecyclerView 的 ViewHolder 来实现,它会触发 UI 事件。

interface ObservableMvpViewHolder<V> {
    val listeners: List<V>

    fun registerListener(listener:V)
    fun unregisterListener (listener: V)

}
Run Code Online (Sandbox Code Playgroud)

listeners属性就像一份合同,因此我希望客户有义务声明它以存储观察者。

但是当我实现这个接口时,我必须声明这个属性的 getter:

class AddItemViewHolderHolder(override val containerView: View) : ViewHolder(containerView), LayoutContainer, ObservableMvpViewHolder<AddItemViewHolderHolder.Listener> {
        override val listeners: List<Listener>
            get() = listeners
Run Code Online (Sandbox Code Playgroud)

我不想这样做是为了避免将此属性暴露给外部。

我是 Kotlin 新手,有没有一种方法可以做到这一点而无需声明抽象类?

小智 2

正如您所说,接口是让每个人阅读的合同,因此,隐藏属于该合同一部分的属性是没有意义的。

它们(接口)可以具有属性,但这些属性必须是抽象的或提供访问器实现。

接口文档

正如您所说,您可以使用抽象类来实现此行为:

abstract class ObservableMvpViewHolder<V> {
    private val listeners : List<V> = emptyList()

    abstract fun registerListener(listener:V)
    abstract fun unregisterListener (listener: V)

}
Run Code Online (Sandbox Code Playgroud)