为什么不';Scala特性是否允许构造函数参数?

为什么不';Scala特性是否允许构造函数参数?,scala,Scala,我是Scala的新手,来自Java,我刚刚读了一些关于特性的书。经常提到的一件事是,traits没有(不能?不会?)构造函数参数。我很想知道这是否有原因 我来自很久以前的数学/计算机科学背景,我想知道这是因为某种语言设计决策而不可避免的结果,还是出于避免某种继承/混合问题或其他原因的自觉决定 我希望有人知道,因为这让我觉得事实背后可能有一些有趣的东西。Traits没有构造函数参数,因为Traits无法被构造。给定任何traitT,不可能精确地实例化任何类型的对象。但是,您可以使用VAL覆盖tra

我是Scala的新手,来自Java,我刚刚读了一些关于特性的书。经常提到的一件事是,traits没有(不能?不会?)构造函数参数。我很想知道这是否有原因

我来自很久以前的数学/计算机科学背景,我想知道这是因为某种语言设计决策而不可避免的结果,还是出于避免某种继承/混合问题或其他原因的自觉决定


我希望有人知道,因为这让我觉得事实背后可能有一些有趣的东西。

Traits没有构造函数参数,因为Traits无法被构造。给定任何trait
T
,不可能精确地实例化任何类型的对象。但是,您可以使用VAL覆盖trait def,因此

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

你不能直接构造它们,因为
newmytrait{}
实际上是一个匿名类
newobject和MyTrait{}

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

我相信这是由于扩展多个特征时会出现的尴尬和冗长,特别是覆盖和类型,以及各种策略的混合

蛋糕模式通常会导致各种各样的特征以一种完全看不见的方式相互提供缺失的片段,这种方式在混合类中是设计出来的。混合可以是双向的,使用。因此,从traits构造类对编译器来说是一件非常麻烦的事情。Scala经常以编译器设计和实现的简单性换取语言使用和代码缩减的简单性,这当然是一个很好的例子


因此,虽然可能存在一些简单的、层次化的情况,其中有一个构造函数可能是有用的和足够的,但对于更困难的、非层次化的情况,它几乎肯定会与其他机制冗余。

答案是:Scala现在就是这样

但将来可能不会这样:特质参数可以取代早期的初始值设定者。(见Martin Odersky最近的报告第34页)

Trait是Java接口的模拟。主要区别在于trait可以为它们的方法提供默认实现


所以Java接口不能有构造函数,Scala traits也不能,Scala 3将允许trait参数。这是一个来自世界各地的样品

trait问候语(val name:String){
def msg=s“你好,$name”
}
C类扩展问候语(“Bob”){
println(msg)
}

考虑到您可以通过覆盖VAL和懒洋洋地处理构造函数体的其余部分来模拟构造函数参数,我怀疑这背后是否有深层次的原因。当然,也许有。也许与Java/Scala互操作有关?Traits没有构造函数。这就是类和traitsRelated之间的定义区别:嗯,同样的逻辑也适用于抽象类,不是吗?我想说,traits应该被允许有构造函数,我也不明白为什么他们不被允许。我不同意这个结论,但给+1,因为你试图回答这个问题,因为它(可能?)是有意的。@Madoc-这是一个弱答案-我对所有的投票感到尴尬。希望像Daniel这样的人会详细说明。不过,你对我问题背后的意图是正确的:)所以谢谢你。