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 に答える