1

有人能解释一下为什么 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?
}
4

1 回答 1

3

这是正常的,就像在 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
}
于 2013-08-12T04:11:21.330 回答