使用 scala 构造函数设置 trait 中定义的变量
Posted
技术标签:
【中文标题】使用 scala 构造函数设置 trait 中定义的变量【英文标题】:Using scala constructor to set variable defined in trait 【发布时间】:2011-12-31 23:47:58 【问题描述】:如果我理解正确的话,trait 是最接近 Java 接口的东西,类构造函数会自动设置变量。
但是,如果我有一个扩展 trait 的类并有一个从 trait 设置变量的构造函数,例如:
trait Foo
var foo: String
class Bar (foo: String) extends Foo /* ... */
当我创建 Bar
对象时,我希望在哪里设置特征的 foo
字符串。
编译器似乎给了我关于这个的错误。实现这一目标的正确方法是什么?
【问题讨论】:
请注意:特征初始化本身并不是一件简单的事情,通过变量和覆盖,您可以非常快速地完成初始化(我做过)。确保你真的需要它。 【参考方案1】:Bar
必须在Foo
中定义抽象var foo
(对于val
也一样)。这可以在构造函数中完成
class Bar(var foo: String) extends Foo...
(当然,也可以在Bar
的正文中完成)。默认情况下,如果需要,构造函数参数将被转换为私有val
,也就是说,如果它们在初始化代码之外,在方法中使用。但是您可以通过将它们标记为val
或var
来强制执行该行为,并可能控制可见性,如
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 对。
【讨论】:
以上是关于使用 scala 构造函数设置 trait 中定义的变量的主要内容,如果未能解决你的问题,请参考以下文章
2021年大数据常用语言Scala(三十一):scala面向对象 特质(trait)