2010-11-23 18 views
6

En Scala, si creo una clase de objeto y compañero, los identificadores declarados con el modificador de protected se puede acceder desde la clase si se importa el objeto:Scala protegida objeto

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

Sin embargo, el identificador de protected no puede ser se accede desde una subclase de la clase Foo:

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

me sale un error en tiempo de compilación en Bar.

Otros (implícitos) public, ¿hay algún modificador de acceso que pueda ubicar en X para que se pueda acceder desde las subclases de su acompañante, pero no desde otras clases, incluidas otras clases en el mismo paquete?

Respuesta

8

Eso es porque solo la clase Foo es compañera del objeto Foo.

Aquí, la diferencia entre private y protected de sentido, puesto que el objeto Foo es un singleton , lo que significa que no hay ningún otro objeto que tiene la misma clase que objeto Foo (Foo.type).

La restricción de acceso en Scala está basada en paquetes, por lo que la respuesta corta es no. Sin embargo, puede hacer un reenviador en la clase base, a menos que necesite que esté disponible sin una instancia.

En su lugar, sin embargo, volvería a la pizarra de diseño.

3

En tales casos, se recomienda usar un modificador privada paquete, como a continuación:

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

El valor todavía será visible a todos los demás en el paquete.

+3

Sólo un pequeño problema: la subclase no siempre está en el mismo paquete. – Nicolas

0

Para lograr lo mismo, Una solución a este problema puede ser:

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