在 Scala 中,特征不仅可以保存方法,还可以保存数据。现在我想知道如何使用特征处理数据 - 我想到了经典的菱形继承(钻石问题),但甚至还有诸如引入两个名称相同的字段(例如一个来自父类(super class),一个来自特征)这样的琐碎情况。
如果可能,用户如何指定她/他想要共享数据或单独数据?
最佳答案
Scala只有私有(private)字段,所以它们不能冲突;访问器方法可以,但这与其他方法的处理方式完全相同。也就是说,如果其中一个方法覆盖另一个方法,则使用该方法;否则,将使用该方法。如果两者都没有,则必须在派生类中实现重写这两个方法的方法。
Does each parent holds its own copy of the data, or not? Or is it up to developer implementing derived class or trait?
特征实际上没有字段,只有方法。当这些方法为 val
时,编译器将在将此特征混合到类中时添加一个同名的(私有(private))字段,并且仅在此时添加。
因此,在菱形继承(钻石问题)中,祖 parent 中只会有一个混合场,因为它在线性化中只出现一次;当
two fields named the same (for example one from a super class and one from the trait)
如果其中任何一个使用var
,则无法覆盖它并且编译失败;如果两者都是 val
并且特征没有扩展父类(super class),则子类将需要重写两者,创建一个新字段;如果特征扩展了父类(super class),子类将从特征中获取字段。
关于scala - 如何使用特征处理数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33188477/