在scala中,有四种成员修饰符,即def
,val
,lazy val
,var
。关于覆盖的规则看似复杂且不一致,例如def
可以被val
覆盖,而不是相反。很高兴看到所有这些规则的完整列表。
答案 0 :(得分:7)
scala中的所有重叠都分为两类,第一种情况是覆盖抽象成员(在trait
或abstract class
中),另一种是覆盖具体成员:
def
,val
,lazy val
,var
可能都会在子类中被覆盖:
def
:可被所有类型的成员(def
,val
,lazy val
和var
)覆盖。
val
:只能由val
覆盖。
lazy val
:只能由lazy val
覆盖。
var
:无法覆盖具体的var
。
lazy val
不能是抽象的,因此只有三个规则:
def
:可被所有类型的成员(def
,val
,lazy val
和var
)覆盖。
val
:可以被val
和lazy val
覆盖。
var
:可以被(1)var
覆盖,或(2)由def
,val
实现的一对读写操作,或lazy val
。
<强>编辑:强>
正如@iuriisusuk所指出,请参阅related section in spec进行正式描述。
答案 1 :(得分:2)
the spec中的两条规则是:
vars无法覆盖vars的限制是因为他们不想为两个vars发出两个字段。还this question。