【问题标题】:Can extending object initialise variables in trait可以扩展特征中的对象初始化变量
【发布时间】:2020-08-12 11:32:42
【问题描述】:

假设我有以下特征和对象:

trait T {
    val x: Int
    println("In Trait", x)
}

object Obj extends T{
    val y: Int = 10
    val x: Int = y
    def run() = {
        println("In Obj", x)
    }
}

Obj.run()
// (In Trait,0)
// (In Obj,10)

我可以让特征T中的x的值与对象Obj中的x的值相同吗?换句话说,我的预期输出应该是:

// (In Trait,10)
// (In Obj,10)

假设y 的值仅在运行时已知。

【问题讨论】:

标签: scala inheritance initialization overriding traits


【解决方案1】:

您看到(In Trait, 0) 的原因是您在特征初始化期间和对象分配值之前打印值。在这种情况下,您将获得默认值0。如果它是一个对象,你会得到一个空指针异常。

一旦对象被初始化,x 的值在对象和特征中都是相同的。

【讨论】:

  • 感谢您的回答!虽然它没有回答我的问题。我有一个在 trait 中实现的逻辑(在我的问题中由 println(x) 模拟),我需要在初始化阶段从 trait 中的对象中使用 x 的值。这个可以吗?
  • 我认为你想要的是早期初始化。检查指向我建议的问题重复的链接,如果它回答了您的问题,您可以将其标记为这样。
  • 问题是没有办法强制 trait 的用户使用早期初始化,所以这感觉像是糟糕的设计。如果我们知道 OP 为什么要这样做,那么可能会有更好的解决方案。
【解决方案2】:

尝试早期初始化器

trait T {
  val x: Int
  println("In Trait", x)
}

object Obj extends {
  val y: Int = 10
  override val x: Int = y
} with T {
  def run() = {
    println("In Obj", x)
  }
}

Obj.run()
// (In Trait,10)
// (In Obj,10)

【讨论】:

    猜你喜欢
    • 2019-11-17
    • 2014-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-05
    • 1970-01-01
    • 2013-05-15
    相关资源
    最近更新 更多