使用 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,也就是说,如果它们在初始化代码之外,在方法中使用。但是您可以通过将它们标记为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 对。

【讨论】:

以上是关于使用 scala 构造函数设置 trait 中定义的变量的主要内容,如果未能解决你的问题,请参考以下文章

Spark基础-scala学习

Scala入门:面向对象编程之Trait 详解

Scala基础语法之Trait详解

2021年大数据常用语言Scala(三十一):scala面向对象 特质(trait)

在 trait 中定义的 Scala 尾递归流处理器函数持有对流头的引用

scala中的trait