scala中def,val,lazy val和var之间的所有重要规则是什么?

Lif*_*ang 3 oop overriding scala

在Scala中,有四种成员修改,即def,val,lazy val,var.关于覆盖的规则看似复杂且不一致,例如,def可以被覆盖val,而不是相反.很高兴看到所有这些规则的完整列表.

Lif*_*ang 8

scala中的所有重叠都分为两类,第一种情况是覆盖抽象成员(in traitabstract class),另一种是覆盖具体成员:

覆盖混凝土构件

def,val,lazy val,var可能都在子类中重写:

  1. def:可以通过各种部件(被覆盖def,val,lazy val,和var).

  2. val:只能被覆盖val.

  3. lazy val:只能被覆盖lazy val.

  4. var:混凝土var不能被覆盖.

覆盖抽象成员

lazy val 不能是抽象的,所以只有三个规则:

  1. def:可以通过各种部件(被覆盖def,val,lazy val,和var).

  2. val:可以被val和重写lazy val.

  3. var:可以通过(1)覆盖var,或者(2)一对由实施读操作和写操作的def,vallazy val.

编辑:

正如@iuriisusuk所指出的,请参阅规范中相关部分以获得正式描述.

  • 为了使其成为一个完美的答案,您不仅要依靠实验,还要检查Scala语言规范是否必须如何.你看 - 实验可以依赖于版本和本地设置. (3认同)
  • @LifuHuang这里是一个链接,正式描述了您提到的大多数内容,例如覆盖和修饰符http://scala-lang.org/files/archive/spec/2.11/05-classes-and-objects.html。唯一的缺点是很多=) (2认同)