我是从Java转换到Scala的新手,最近在阅读Traits方面的文章时经常看到一句话:Traits不能有构造器参数(不会?不应该?)。我很好奇是否有特别的原因导致这种情况。
作为一个数学/计算机科学背景多年以前的人,我想知道这是否是由于某些语言设计决策而不可避免的后果,还是出于避免某些继承/混入问题或其他原因而有意决定的?
希望有人能解答,因为这似乎背后可能隐藏着一些有趣的事情。
我是从Java转换到Scala的新手,最近在阅读Traits方面的文章时经常看到一句话:Traits不能有构造器参数(不会?不应该?)。我很好奇是否有特别的原因导致这种情况。
作为一个数学/计算机科学背景多年以前的人,我想知道这是否是由于某些语言设计决策而不可避免的后果,还是出于避免某些继承/混入问题或其他原因而有意决定的?
希望有人能解答,因为这似乎背后可能隐藏着一些有趣的事情。
trait Greeting(val name: String) {
def msg = s"How are you, $name"
}
class C extends Greeting("Bob") {
println(msg)
}
trait Foo {
def bar: String
}
class Baz(override val bar: String) extends Foo
你不能直接构造它们,因为new MyTrait {}
实际上是new Object with MyTrait {}
的匿名类糖语法。
Trait是Java接口的类比。主要区别在于Trait可以为其方法提供默认实现。
因此,Java接口无法具有构造函数,Scala Trait也是如此。