我是新来的Scala,来自Java,我只是读了关于特性。有一件事经常被提到,特质不(不会?不会?)具有构造参数。我很想知道是否有这个原因。为什么Scala特质不允许构造函数参数?
来自很久以前的数学/计算机科学背景我一直在想,如果这是由于某种语言设计决定造成的不可避免的后果,或者如果这是一个有意识的决定,以避免一些继承/混合问题或另一个?
希望有人知道,因为它感觉有可能是事实背后有一些有趣的事情。
我是新来的Scala,来自Java,我只是读了关于特性。有一件事经常被提到,特质不(不会?不会?)具有构造参数。我很想知道是否有这个原因。为什么Scala特质不允许构造函数参数?
来自很久以前的数学/计算机科学背景我一直在想,如果这是由于某种语言设计决定造成的不可避免的后果,或者如果这是一个有意识的决定,以避免一些继承/混合问题或另一个?
希望有人知道,因为它感觉有可能是事实背后有一些有趣的事情。
其他的答案描述语言;我怀疑你的问题可能真的是“为什么这样设计”。
我相信它产生于awkwardnesses和冗长外即延长当多个性状,尤其是与覆盖,并与类型,以及各种混合式策略会出现。
蛋糕模式通常会导致各种性状以混合类中完全不可见的方式提供缺失位。并且混合可以是双向的,使用self-types。因此,从特质中构建一个类对于编译器来说可能是非常混乱的事情。为了简化语言使用和代码简化,Scala经常交换编译器设计和实现的简单性,这当然是一个很好的例子。
因此,尽管在具有构造可能是有用的和足够的有可能是简单的,分层的情况下,它几乎肯定是多余的更多的困难,不分层场景的其他机制。
特征没有构造函数参数,因为特征不能构造。鉴于任何特征T
这是不可能实例化任何类型的对象完全是T
。您可以覆盖特质DEFS有丘壑了,所以
trait Foo {
def bar: String
}
class Baz(override val bar: String) extends Foo
你不能直接构造它们,因为new MyTrait {}
实际上是糖匿名类的new Object with MyTrait {}
嗯。同样的逻辑适用于抽象类,不是吗?我会说特质*应该被允许有构造函数,而且我也不明白他们为什么不被允许。 – Madoc 2015-04-01 14:58:00
答案是:这就是Scala现在的情况。
但可能不会在将来的情况:特征参数可以取代早期的初始化。 (请参见Martin Odersky最近的Scala Days演示文稿第34页) Scala: Where It Came From & Where It is Going
特征是Java接口的模拟特征。主要区别在于特质可以为其方法实施默认实现。
所以Java接口不能有构造函数,以便做斯卡拉性状
考虑您可以通过覆盖瓦尔斯和懒洋洋地做着构造身体的其余部分几乎模拟构造函数的参数,我怀疑有一个背后的深层次原因。当然,也许有。也许与Java/Scala互操作有关? – Cubic 2015-04-01 14:00:31
特征没有构造函数。这几乎是类和特质的定义区别 – Martijn 2015-04-01 14:01:55
相关:http://stackoverflow.com/questions/2804041/constructor-in-an-interface – 2015-04-01 15:09:06