2010-11-23 5 views
6

In Scala, wenn ich ein Objekt und Begleiter Klasse zu erstellen, erklärte Bezeichner mit dem protected Modifikator kann aus der Klasse zugegriffen werden, wenn das Objekt importiert wird:Scala geschütztes Objekt

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

jedoch die protected Kennung kann nicht sein, von einer Unterklasse der Klasse Foo zugegriffen:

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

ich einen Fehler bei der Kompilierung in Bar bekommen.

Andere dann (implizit) public, gibt es irgendeinen Zugriffsmodifizierer, den ich auf X platzieren kann, damit auf Unterklassen seines Begleiters zugegriffen werden kann, aber nicht auf andere Klassen, einschließlich anderer Klassen im selben Paket?

Antwort

8

Das ist, weil nur die Klasse Foo Begleiter zum Objekt Foo ist.

Hier wird die Differenz zwischen private und protected bedeutungslos, da das Objekt ein FooSingletons, das bedeutet, es gibt kein anderes Objekt, das die gleiche Klasse wie Objekt hat Foo (Foo.type).

Zugriffsbeschränkung in Scala ist Paket-basiert, so ist die kurze Antwort nein. Sie können jedoch eine Weiterleitung für die Basisklasse erstellen, es sei denn, Sie benötigen sie, um ohne eine Instanz verfügbar zu sein.

An Ihrer Stelle würde ich jedoch zurück zum Design Board gehen.

3

In solchen Fällen würde ich vorschlagen, ein Paket privaten Modifikator verwenden, wie unten:

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

Der Wert wird nach wie vor auf alle anderen in der Verpackung sichtbar sein.

+3

Nur ein kleines Problem: Ihre Unterklasse ist in der gleichen Verpackung nicht immer. – Nicolas

0

das Gleiche zu erreichen, kann eine Lösung für dieses Problem sein:

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