Scala защищенный объект - PullRequest
       8

Scala защищенный объект

7 голосов
/ 23 ноября 2010

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

Ответы [ 3 ]

8 голосов
/ 23 ноября 2010

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

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

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

Однако на вашем месте я бы вернулся к доске объявлений.

3 голосов
/ 23 ноября 2010

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

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

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

0 голосов
/ 02 июля 2014

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

class Bar extends Foo {
  import Foo._
  override def getX(): Int = super.getX * 2
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...