Interface 初始化接口实例变量

Interface 初始化接口实例变量,interface,kotlin,Interface,Kotlin,我想通过使用接口在Kotlin类中注入(丰富)行为和状态。像类Impl:Observable,其中Observable包含状态 在Scala中,使用Traits(确实有效),正在为此寻找Kotlin解决方案: 对象测试扩展应用程序{ val impl=新impl() val observer=新的观察者() 植入寄存器(观察者) } 可观察性状{ //如何在科特林做到这一点? val观察员=列表() def寄存器(观察者:观察者){ 观察员。添加(观察员) } } 类观察员 班级家长 类Impl

我想通过使用接口在Kotlin类中注入(丰富)行为和状态。像
类Impl:Observable
,其中Observable包含状态

在Scala中,使用Traits(确实有效),正在为此寻找Kotlin解决方案:

对象测试扩展应用程序{
val impl=新impl()
val observer=新的观察者()
植入寄存器(观察者)
}
可观察性状{
//如何在科特林做到这一点?
val观察员=列表()
def寄存器(观察者:观察者){
观察员。添加(观察员)
}
}
类观察员
班级家长
类Impl使用可观察的
在Kotlin中尝试(不工作):

fun main(args:Array){
val impl=impl()
val observer=observer()
植入寄存器(观察者)
}
可观测界面{
//错误:Kotlin:接口中不允许使用属性初始值设定项
val observers=mutableListOf()
乐趣登记册(观察员:观察员){
观察员。添加(观察员)
}
}
类观察员
开放类父类
类Impl:Parent(),可观察
它在接口实例变量行导致此错误:
Kotlin:接口中不允许使用属性初始值设定项
。 如何在Kotlin接口中初始化实例变量? (请注意,在此设计中,不应更改/更新父类。)


更新:我有一个Java示例解决方案,但它的行为不正确。Java接口中的“实例变量”自动是静态的。因此,我删除了这个示例。

在Java中,实际上有一个静态字段,而不是实例字段(与Scala代码不同,Scala代码可以按预期工作):

在Kotlin中,可以通过将字段放入同伴对象来实现相同的行为

但实际上应该使用
抽象类
而不是接口

或:

可观察的接口{
乐趣登记册(观察员:观察员)
}
类observer列表:可观察{
val observers=mutableListOf()
覆盖乐趣寄存器(观察者:观察者){
观察员。添加(观察员)
}
}
类Impl:Parent(),可由ObserverList()观察

您可以在Kotlin接口中为状态设置占位符,并让实现类提供该状态。因此,接口可以提供针对预期存在状态的功能。例如:

class Observer

interface Observable {
    val observers: MutableList<Observer> // not present, but expected

    fun register(observer: Observer) {
        observers.add(observer)
    }
}

open class Parent

class Impl : Parent(), Observable {
    override val observers = mutableListOf<Observer>() // used by the interface
}
类观察器
可观测界面{
val观察员:可变列表//不存在,但应为
乐趣登记册(观察员:观察员){
观察员。添加(观察员)
}
}
开放类父类
类Impl:Parent(),可观察{
override val observators=mutableListOf()//由接口使用
}

这是有充分理由的,在类层次结构中有一些微妙的问题,状态来自多个项,Kotlin正在防止这些模型可能产生的问题。

关于Java接口中的实例变量是静态的,你是对的。我刚刚更新了我的帖子来反映这一点。但是抽象类不是一个选项,因为该类必须扩展另一个不能修改的类。因此,我猜在Scala中称之为“充实”在Java或Kotlin中是不可能的。充实不能添加实例变量(扩展类不是“充实”)。@AlexeyRomanov这并不能解决问题,允许接口支持针对其想要定义的状态的逻辑。在Kotlin中有一种方法可以做到这一点。如果你只是稍微扭转一下,这是可能的。我添加了一个答案,因为被接受的答案并没有涵盖你可以做什么来实现你试图实现的目标。太快地接受答案意味着你以后可能无法得到正确的答案。
interface Observable {
    fun register(observer: Observer)
}

class ObserverList : Observable {
    val observers = mutableListOf<Observer>()

    override fun register(observer: Observer) {
        observers.add(observer)
    }
}

class Impl : Parent(), Observable by ObserverList()
class Observer

interface Observable {
    val observers: MutableList<Observer> // not present, but expected

    fun register(observer: Observer) {
        observers.add(observer)
    }
}

open class Parent

class Impl : Parent(), Observable {
    override val observers = mutableListOf<Observer>() // used by the interface
}