我遇到了一些与案例类和override protected val
相关的奇怪事情。
假设trait T
有受保护的def
(或val
)。
trait T {
protected def s: String
def print(): Unit = println(s)
}
我可以使用def s
覆盖此方法val s
。没问题。
class A(override val s: String) extends T
行。它汇编。但这会使s
公开,因为没有受保护的关键字。
class B extends T {
override protected val s: String = "Show me the money"
}
行。它汇编。 (s
的{{1}}受到保护)
class B
行。它汇编。 (class C(override protected val s: String) extends T
的{{1}}受到保护)
我们用s
来完成这些。
class C
行。它汇编。 (虽然case class
的{{1}}是公开的)
case class D(override val s: String) extends T
行。它汇编。 (s
的{{1}}受到保护)
class D
行。它汇编。 (case class E() extends T {
override protected val s: String = "Show me the money"
}
的{{1}}受到保护,s
也被覆盖,因为它在class E
中并不具体。它是抽象的,因此case class F(protected val s: String) extends T
关键字不是必需的。)
s
此处出现编译错误。
class F
基本上,s
和trait T
是相同的。 override
覆盖case class G(override protected val s: String) extends T
,error: value s$1 overrides nothing
受到保护。这可以通过class F
确实打印class G
来显示。
class F
可以在s
显示的案例类中使用。它在定义普通类s
时没有出错。
但是,仅定义F("Something").print()
会导致编译错误。
为什么会发生这件事?
我正在使用Scala 2.10.3