【问题标题】:Using scala constructor to set variable defined in trait使用 scala 构造函数设置 trait 中定义的变量
【发布时间】:2023-03-21 17:06:01
【问题描述】:

如果我理解正确的话,trait 是最接近 Java 接口的东西,类构造函数会自动设置变量。

但是,如果我有一个扩展 trait 的类并有一个从 trait 设置变量的构造函数,例如:

trait Foo {
    var foo: String
}

class Bar (foo: String) extends Foo { /* ... */ }

当我创建 Bar 对象时,我希望在哪里设置特征的 foo 字符串。

编译器似乎给了我关于这个的错误。实现这一目标的正确方法是什么?

【问题讨论】:

  • 请注意:特征初始化本身并不是一件简单的事情,通过变量和覆盖,您可以非常快速地完成初始化(我做过)。确保你真的需要它。

标签: scala constructor traits


【解决方案1】:

Bar 必须在Foo 中定义抽象var foo(对于val 也一样)。这可以在构造函数中完成

class Bar(var foo: String) extends Foo{...}

(当然,也可以在Bar 的正文中完成)。默认情况下,如果需要,构造函数参数将被转换为私有val,也就是说,如果它们在初始化代码之外,在方法中使用。但是您可以通过将它们标记为valvar 来强制执行该行为,并可能控制可见性,如

class X(protected val s: String, private var i: Int)

这里你需要一个公开的var 来实现Foo

【讨论】:

    【解决方案2】:
    trait Foo { var foo: String = _ }
    class Bar(foo0: String) extends Foo { foo = foo0 }
    

    特征声明了一个未初始化的变量;然后该类将其设置为等于输入参数。

    或者,

    trait Foo {
      def foo: String
      def foo_=(s: String): Unit
    }
    class Bar(var foo: String) extends Foo {}
    

    声明对应于类的 foo 的 getter/setter 对。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-22
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 2017-05-28
      • 1970-01-01
      • 2018-09-01
      • 1970-01-01
      相关资源
      最近更新 更多