有人能解释一下为什么 scala 会允许一个公共变量来满足抽象声明的受保护项的实现吗?我的第一个假设是编译器会抱怨,但我创建了一个小测试来看看这是否有效,令我惊讶的是它确实有效。这有优势吗?(也许这在 OOP 中很正常?)有什么方法可以避免意外陷阱?
object NameConflict extends App {
abstract class A {
protected[this] var name:String
def speak = println(name)
}
class B(var name:String) extends A { //notice we've declared a public var
}
val t = new B("Tim")
t.speak
println(t.name) // name is exposed now?
}