【发布时间】:2014-02-12 03:36:50
【问题描述】:
最近有人告诉我,Scala 的特征不是“真正的”特征,它们实际上只是混合。不幸的是,我没有机会问他为什么。有人知道他的意思吗?
编辑: 作为“特质”的定义,我一直指的是 Nathanael Schärli 的 dissertation and concept paper 介绍特质。大多数 mixin 和/或多重继承实现似乎缺少的一项关键功能是在导入方法时重命名方法以避免冲突/歧义的能力。 Scala 能做到吗?
【问题讨论】:
-
必须定义“trait”与“mixin”。例如,Ruby“mixins”在实现中不像 Scala“traits”(我认为 Ruby“mixins”可能更接近提到的“真实特征”?本质上是“MRO 中的存根”;-),这可能会抛出论点 - 术语需要更好的定义:-)
-
如果我们发现它们不是“真正的”特征,那么最好有人去更新维基百科。 en.wikipedia.org/wiki/Trait_(computer_science)
-
感谢您的提示,pst,我已经编辑了我的帖子以澄清。
-
对于“真正的”特征实现,请查看 Perl 的 Moose::Roles 或 Javascript 的 traits.js。另外,我提出了一个类似的feature for C#(在Java 中可能非常相似)。我也开始了implementing这个愿景。
-
Scharli's dissertation 提到并讨论了 Scala 的特征(第 123 页)作为“特别有趣”的改编。主要区别在于: - Scala 特征被建模为不封装状态的抽象类, - Scala 特征不仅可以组合,还可以继承 - Scala 特征支持泛型 - Scala 特征不支持别名和排除