为什么Scala特征不允许构造函数参数?

mon*_*ery 3 scala

我是Scala的新手,来自Java,我只是在阅读有关特征的内容.经常提到的一件事是特征不会(不能?不会?)具有构造函数参数.我很想知道这是否有原因.

来自很久以前的数学/计算机科学背景,我想知道这是否是一个不可避免的后果,因为一些语言设计决定,或者是否有意识地决定避免一些继承/混合问题或其他?

希望有人知道,因为事实背后可能会有一些有趣的东西.

Ed *_*aub 9

其他答案描述了语言; 我怀疑你的问题可能真的是"它为什么以这种方式设计".

我认为它源于在扩展多种特征时会出现的尴尬和冗长,特别是在覆盖和类型以及各种混合策略的情况下.

蛋糕模式通常会导致各种特性以混合类中完全不可见的方式相互提供缺失的位.混合可以是双向的,使用自我类型.因此,从特征构造类对于编译器来说可能是一个非常混乱的业务.Scala经常将编译器设计和实现的简单性换成简单的语言使用和代码减少,这当然是一个很好的例子.

因此,虽然可能存在简单的分层情况,其中具有构造函数可能是有用且充分的,但对于更困难的非分层场景,它几乎肯定必须是其他机制的冗余.


Joe*_*ley 5

Scala 3 将允许特征参数。这是文档中的示例

trait Greeting(val name: String) {
  def msg = s"How are you, $name"
}

class C extends Greeting("Bob") {
  println(msg)
}
Run Code Online (Sandbox Code Playgroud)