【问题标题】:Scala protected objectScala 保护对象
【发布时间】:2011-05-14 14:59:00
【问题描述】:

在 Scala 中,如果我创建了一个对象和伴随类,那么如果导入了该对象,则可以从该类中访问使用 protected 修饰符声明的标识符:

object Foo {
  protected val X = 42
}
class Foo {
  import Foo._
  def getX(): Int = X
}

但是,protected 标识符不能从 Foo 类的子类访问:

class Bar extends Foo {
  import Foo._
  def getX(): Int = X * 2
}

我在Bar 中收到编译时错误。

然后(隐含)public,我可以在X 上放置任何访问修饰符,以便可以从其同伴的子类访问它,但不能从其他类访问,包括同一包中的其他类?

【问题讨论】:

    标签: scala protected


    【解决方案1】:

    为了达到同样的目的,解决这个问题的一种方法是:

    class Bar extends Foo {
      import Foo._
      override def getX(): Int = super.getX * 2
    }
    

    【讨论】:

      【解决方案2】:

      在这种情况下,我建议使用包私有修饰符,如下所示:

      object Foo {
        private[your_package] val X = 42
      }
      

      该值仍然对包中的其他所有人可见。

      【讨论】:

      • 只是一个小问题:您的子类并不总是在同一个包中。
      【解决方案3】:

      这是因为只有类 Foo 是对象 Foo 的伴侣。

      这里,privateprotected 之间的区别没有意义,因为对象Foo 是一个单例,这意味着没有任何其他对象与对象具有相同的类Foo (Foo.type)。

      Scala 中的访问限制是基于包的,所以简短的回答是否定的。不过,您可以在基类上创建一个转发器,除非您需要它在没有实例的情况下可用。

      不过,在你的位置上,我会回到设计委员会。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-07
        • 2012-11-22
        • 2015-04-23
        • 2011-08-21
        • 2012-11-14
        • 2012-10-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多