scala - 如何使用特征处理数据?

标签 scala traits

在 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/

相关文章:

python - 检查 TreeView 的特征堆栈?

scala - 将路由从 spray.io 迁移到 akka http

scala - 在 IntelliJ Idea 14 上玩 Activator 问题

struct - 实现 Rust 特征会导致找不到结构

c++ - 从 trait 获取 const 或非常量引用类型

php - php中多重继承的最佳方式是什么?

用于模式匹配的 Scala 类型删除

scala - 将类限制为 Scala 中的特征和结构子类型

scala - 提升请求对象

rust - 特性作为通用参数来构造对象初始化