2015-04-01 81 views
1

我是新来的Scala,来自Java,我只是读了关于特性。有一件事经常被提到,特质不(不会?不会?)具有构造参数。我很想知道是否有这个原因。为什么Scala特质不允许构造函数参数?

来自很久以前的数学/计算机科学背景我一直在想,如果这是由于某种语言设计决定造成的不可避免的后果,或者如果这是一个有意识的决定,以避免一些继承/混合问题或另一个?

希望有人知道,因为它感觉有可能是事实背后有一些有趣的事情。

+0

考虑您可以通过覆盖瓦尔斯和懒洋洋地做着构造身体的其余部分几乎模拟构造函数的参数,我怀疑有一个背后的深层次原因。当然,也许有。也许与Java/Scala互操作有关? – Cubic 2015-04-01 14:00:31

+0

特征没有构造函数。这几乎是类和特质的定义区别 – Martijn 2015-04-01 14:01:55

+0

相关:http://stackoverflow.com/questions/2804041/constructor-in-an-interface – 2015-04-01 15:09:06

回答

7

其他的答案描述语言;我怀疑你的问题可能真的是“为什么这样设计”。

我相信它产生于awkwardnesses和冗长外即延长当多个性状,尤其是与覆盖,并与类型,以及各种混合式策略会出现。

蛋糕模式通常会导致各种性状以混合类中完全不可见的方式提供缺失位。并且混合可以是双向的,使用self-types。因此,从特质中构建一个类对于编译器来说可能是非常混乱的事情。为了简化语言使用和代码简化,Scala经常交换编译器设计和实现的简单性,这当然是一个很好的例子。

因此,尽管在具有构造可能是有用的和足够的有可能是简单的,分层的情况下,它几乎肯定是多余的更多的困难,不分层场景的其他机制。

+0

我不同意这个结论,但给了+1,因为你试图回答这个问题,因为它可能是(可能?)的意图。 – Madoc 2015-04-01 14:59:36

+0

@Madoc - 这是一个微弱的回答 - 我为所有的赞扬感到尴尬。希望像丹尼尔这样的人会考虑具体情况。 – 2015-04-01 15:12:57

+0

你对我的问题背后的意图是正确的:)谢谢。 – moncheery 2015-04-01 16:13:32

2

特征没有构造函数参数,因为特征不能构造。鉴于任何特征T这是不可能实例化任何类型的对象完全是T。您可以覆盖特质DEFS有丘壑了,所以

trait Foo { 
    def bar: String 
} 
class Baz(override val bar: String) extends Foo 

你不能直接构造它们,因为new MyTrait {}实际上是糖匿名类的new Object with MyTrait {}

+4

嗯。同样的逻辑适用于抽象类,不是吗?我会说特质*应该被允许有构造函数,而且我也不明白他们为什么不被允许。 – Madoc 2015-04-01 14:58:00

0

特征是Java接口的模拟特征。主要区别在于特质可以为其方法实施默认实现。

所以Java接口不能有构造函数,以便做斯卡拉性状

相关问题