代码之家  ›  专栏  ›  技术社区  ›  Ralph java.is.for.desktop

scala保护对象

  •  7
  • Ralph java.is.for.desktop  · 技术社区  · 14 年前

    在scala中,如果我创建一个对象和伴生类,用 protected 如果导入对象,则可以从类访问修饰符:

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

    然而, 受保护的 无法从foo类的子类访问标识符:

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

    我得到一个编译时错误 Bar .

    其他(暗示) public ,有什么访问修饰符可以放在上面吗? X 这样它就可以从其伙伴的子类访问,而不是从其他类(包括同一包中的其他类)访问?

    3 回复  |  直到 10 年前
        1
  •  8
  •   Daniel C. Sobral    14 年前

    那是因为只有班级 Foo 是对象的伴侣 .

    这里,两者之间的区别 private protected 没有意义,因为对象 是一个 独生子女 ,这意味着没有任何其他对象与对象具有相同的类 ( Foo.type )

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

    但是,在你的位置,我会回到设计板。

        2
  •  3
  •   axel22    14 年前

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

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

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

        3
  •  0
  •   SmartSolution    10 年前

    为了实现同样的目标,解决这个问题的一个方法是:

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