看完Martin's keynote on Reflection and Compilers后,我似乎无法从头脑中得到这个疯狂的问题。马丁谈到了“(婚礼)蛋糕模式”,其中特质扮演着核心角色。我想知道,为什么在我们已经有特征时我们需要包裹? package
可以做什么,trait
(至少在理论上)不能做什么?
我不是在谈论当前的实现,我只是想象一下,如果我们用特征替换包,那会是什么样的编程。在我脑海里,它会是这样的:
package
不需要)package object
s 总结我的所有问题:
更新
Daniel Spiewak在this keynote中谈到依赖注入只是你可以用Cake Pattern做的所有事情的冰山顶。
答案 0 :(得分:7)
Martin Odersky说Scala可以通过特征,对象,方法和路径来实现(我希望我没有忘记一些事情)。
类和包都在那里,因为Scala旨在成为托管语言,即运行的语言(这实际上不是有趣的位)和与互操作(这是重要的)点)主机平台。 Scala旨在与之互操作的一些主机平台是Java平台和CLI,它们都具有类和包的概念(在CLI的情况下为命名空间),这些概念非常明显,不能轻易表达为特征或对象。这与接口不同,接口可以简单地映射到纯粹抽象的特征。
上述声明是在讨论可能从Scala中删除泛型的,因为泛型可以做的所有事情也可以通过抽象类型来实现。
答案 1 :(得分:6)
在scala中,对象和包的用途几乎相同,对象也称为模块。对象应该被视为模块,因为它们可以包含任何定义,包括其他对象,当然还有类型。
特质可以被认为是一个抽象模块。它可以包含任何定义,任何成员都可以是抽象的,包括类型成员。我正在背诵所有这些只是为了突出对称性。对我来说,特征似乎只是对象和功能性思想的融合,与scala一样具有创新性。
最后给出答案:
更多评论:在视频中,马丁谈论的特征(抽象模块)不仅仅是具体的模块,因为后者只是出现在最后时刻才能汇集和统一抽象模块的某些组合。
即使不“混合蛋糕”,也可以使用抽象模块。例如在草拟一些代码时,您可以定义一个包含定义的模块。但是一旦你来到一个类型或值,你还没准备好填写,不要提供像null这样的虚拟。而是将对象切换为特征并将成员保留为摘要。