【发布时间】:2018-02-20 02:05:25
【问题描述】:
我想通过使用接口在 Kotlin 类中注入(丰富)行为和状态。像class Impl : Observable,其中 Observable 包含状态。
在 Scala 中使用 Traits(确实有效),为此寻找 Kotlin 解决方案:
object Test extends App {
val impl = new Impl()
val observer = new Observer()
impl.register(observer)
}
trait Observable {
// How to do this in Kotlin?
val observers = List()
def register(observer: Observer) {
observers.add(observer)
}
}
class Observer
class Parent
class Impl extends Parent with Observable
在 Kotlin 中的尝试(不工作):
fun main(args: Array<String>) {
val impl = Impl()
val observer = Observer()
impl.register(observer)
}
interface Observable {
// Error: Kotlin: Property initializers are not allowed in interfaces
val observers = mutableListOf<Observer>()
fun register(observer: Observer) {
observers.add(observer)
}
}
class Observer
open class Parent
class Impl : Parent(), Observable
导致接口实例变量行出现此错误:Kotlin: Property initializers are not allowed in interfaces。
如何在 Kotlin 接口中初始化实例变量?
(请注意,在此设计中,不应更改/更新父类。)
更新:我有一个 Java 示例解决方案,但它的行为不正确。 Java 接口中的“实例变量”自动是静态的。所以我删除了那个例子。
【问题讨论】:
-
如果您稍微转一下,这是可能的,我添加了一个答案,因为接受的答案不包括您实际可以做些什么来实现与您试图实现的相同目标。太快接受答案意味着您以后可能无法获得正确的答案。