2010-11-23 3 views
6

В Scala, если я создаю объект и сопутствующий класс, идентификаторы, объявленные с модификатором protected можно получить из класса, если объект импортируется:Scala защищенный объект

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 так, что его можно получить из подклассов своего компаньона, но не из других классов, в том числе других классов в одном пакете?

ответ

8

Это потому, что только класс Foo является компаньоном для объекта Foo.

Здесь разница между private и protected бессмысленными, поскольку объект Foo является одноэлементным, что означает, что какой-либо другой объект, который имеет тот же класс как объект Foo (Foo.type).

Ограничение доступа в Scala основано на пакетах, поэтому короткий ответ - нет. Однако вы можете сделать пересылку в базовом классе, если только вам не нужно, чтобы он был доступен без экземпляра.

На вашем месте, однако, я вернусь на конструкцию.

3

В таких случаях, я хотел бы предложить использовать пакет частный модификатор, как показано ниже:

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

Значение по-прежнему будет виден всем остальным в пакете.

+3

Просто небольшая проблема: ваш подкласс не всегда в том же пакете. – Nicolas 2010-11-24 08:07:30

0

Чтобы достичь того же, Одно из решений этой проблемы может быть:

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