Scala中受保护的抽象变量可以公开实现吗?
有人能解释为什么scala会允许一个公共变量来满足抽象声明的受保护项的实现吗?我的第一个假设是编译器会抱怨,但我创建了一个小测试,看看这是否有效,令我惊讶的是它确实有效。这有什么好处吗?(也许这在OOP中是正常的?)有没有避免意外陷阱的方法Scala中受保护的抽象变量可以公开实现吗?,scala,Scala,有人能解释为什么scala会允许一个公共变量来满足抽象声明的受保护项的实现吗?我的第一个假设是编译器会抱怨,但我创建了一个小测试,看看这是否有效,令我惊讶的是它确实有效。这有什么好处吗?(也许这在OOP中是正常的?)有没有避免意外陷阱的方法 object NameConflict extends App { abstract class A { protected[this] var name:String def speak = println(name) }
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?
}
这是正常的,就像在Java中一样。有时,增加成员的可见性是可取的 您不能以相反的方式关闭子类中的可见性,因为根据定义,可以通过超类型访问成员 如果调用一个方法会产生可怕的后果,请将该方法保持私有,并使用可以重写的模板方法;默认实现将调用危险的方法
abstract class A {
private[this] def dangerous = ???
final protected def process: Int = {
dangerous
template
}
protected def template: Int = ???
}
class B extends A {
override def template = 5
}