English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Ограничители доступа в Scala в основном такие же, как и в Java,分别是: private, protected, public.
Если не указан уровень доступа, по умолчанию уровень доступа объектов Scala составляет public.
Ограничитель private в Scala stricter, чем в Java, и в случае вложенных классов даже внешние классы не могут доступа к частным членам вложенных классов.
используя ключевое слово private, члены, помеченные этим знаком, видны только в классе или объекте, содержащем их определение, и та же rule применяется к внутренним классам.
class Outer{ class Inner{ private def f(){ println("f") } class InnerMost{ f() // правильно } } (new Inner).f() // ошибка }
доступ не законен, потому что f в Inner был объявлен как private, а доступ не в классе Inner.
но при доступе из InnerMost f нет проблем, потому что этот доступ включает在内 классе Inner.
Java позволяет这两种 доступа, потому что он позволяет внешним классам доступ к частным членам внутренних классов.
В Scala доступ к защищенным (Protected) членам stricter, чем в Java. Потому что он позволяет доступ к защищенным членам только в подклассах, определивших этот член. В Java, член, помеченный protected, доступен не только подклассам, определившим его, но и другим классам в том же пакете.
package p{ class Super{ protected def f() { println("f") } } class Sub extends Super{ f() } class Other{ (new Super).f() // ошибка } }
В примере, у класса Sub нет проблем с доступом к f, потому что f в Super был объявлен как protected, а Sub является подклассом Super. Напротив, доступ Other к f не разрешен, потому что Other не наследуется от Super. Последнее также признается в Java, потому что Other и Sub находятся в одном пакете.
В Scala, если не указан ни один модификатор доступа, то по умолчанию он public. Этот член может быть доступен везде.
class Outer { class Inner { def f() { println("f") } class InnerMost { f() // правильно } } (new Inner).f() // правильно, потому что f() public }
В Scala доступ к модификаторам доступа можно подчеркивать с помощью限定词. Формат:
private[x] или protected[x]
Здесь x указывает на пакет, класс или单体对象. Если写成 private[x], это читается как "Этот член виден только для класса [...] или для класса в [...] пакете и их сопутствующих объектов, а для всех остальных классов он private.
Эта техника очень полезна в больших проектах, которые разрабатываются через несколько пакетов, она позволяет определить某些 элементы, которые видны в некоторых подпакетах вашего проекта, но всегда недоступны для клиентов за пределами проекта.
package bobsrockets{ package navigation{ private[bobsrockets] class Navigator{ protected[navigation] def useStarChart(){} class LegOfJourney{ private[Navigator] val distance = 100 } private[this] var speed = 200 } } package launch{ import navigation._ object Vehicle{ private[launch] val guide = new Navigator } } }
В предыдущем примере класс Navigator помечен как private[bobsrockets], что означает, что этот класс видим для всех классов и объектов, включенных в пакет bobsrockets.
Например, доступ к Navigator из объекта Vehicle разрешен, потому что объект Vehicle включен в пакет launch, а пакет launch включен в bobsrockets, в то время как все коды за пределами пакета bobsrockets не могут получить доступ к классу Navigator.