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

时间:2016-10-15 09:25:34

标签: scala oop override

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

2 个答案:

答案 0 :(得分:7)

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

覆盖混凝土构件

defvallazy valvar可能都会在子类中被覆盖:

  1. def:可被所有类型的成员(defvallazy valvar)覆盖。

  2. val:只能由val覆盖。

  3. lazy val:只能由lazy val覆盖。

  4. var:无法覆盖具体的var

  5. 覆盖抽象成员

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

    1. def:可被所有类型的成员(defvallazy valvar)覆盖。

    2. val:可以被vallazy val覆盖。

    3. var:可以被(1)var覆盖,或(2)由defval实现的一对读写操作,或lazy val

    4. <强>编辑:

      正如@iuriisusuk所指出,请参阅related section in spec进行正式描述。

答案 1 :(得分:2)

the spec中的两条规则是:

  • “稳定的成员只能被稳定的成员覆盖。”
  • lazy val必须被lazy val覆盖。

vars无法覆盖vars的限制是因为他们不想为两个vars发出两个字段。还this question