gpt4 book ai didi

interface - 初始化接口(interface)实例变量

转载 作者:行者123 更新时间:2023-12-02 12:05:15 25 4
gpt4 key购买 nike

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

在使用 Traits 的 Scala 中(确实有效),为此寻找 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

它会导致接口(interface)实例变量行出现此错误: Kotlin: Property initializers are not allowed in interfaces .
如何在 Kotlin 接口(interface)中初始化实例变量?
(请注意,在此设计中,不应更改/更新父类。)

更新:我在 Java 中有一个示例解决方案,但它的行为不正确。 Java 接口(interface)中的“实例变量”自动是静态的。所以我删除了那个例子。

最佳答案

您可以在 Kotlin 接口(interface)中使用状态占位符,并让实现类提供该状态。因此,接口(interface)可以提供与预期存在状态相反的功能。如:

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
}

这是有充分理由的,存在来自类层次结构中多个项目的状态的微妙问题,而 Kotlin 正在防止此类模型可能出现的问题。

关于interface - 初始化接口(interface)实例变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48857526/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com