在Scala中,traits不仅可以包含方法,还可以包含数据。现在我想知道数据是如何用特征处理的 - 我想到了经典的钻石问题,但是甚至包括两个名称相同的字段(例如一个来自超级类,一个来自特征)的微不足道的情况。
如果可能,用户如何指定他/她想要共享数据或单独的数据?
答案 0 :(得分:2)
Scala只有私有字段,所以不能冲突;存取方法可以,但这与其他方法完全相同。即,如果其中一种方法覆盖另一种方法,则使用它;如果两者都没有,则必须实现覆盖派生类的方法。
每位家长是否拥有自己的数据副本?还是由开发人员实现派生类或特征?
特征不是真的有字段,只有方法。当这些方法为val
时,编译器将添加一个具有相同名称的(私有)字段,以便将此特征混合到一个类中,并且仅在此时。
因此,在钻石问题中,祖父母只会混合一个场,因为它只出现在线性化中;当
两个名称相同的字段(例如,一个来自超级类,一个来自特征)
如果它们中的任何一个使用var
,它就不能被覆盖并且它将无法编译;如果两者都是val
并且特征没有扩展超类,则子类将需要覆盖两者,创建一个新字段;如果特征扩展了超类,则子类将从特征中获取字段。