Scala - модификаторы доступа
В этой главе вы познакомитесь с модификаторами доступа Scala. Члены пакетов, классов или объектов могут быть помечены модификаторами доступа как private и protected, и если мы не используем ни одно из этих двух ключевых слов, то доступ будет считаться общедоступным. Эти модификаторы ограничивают доступ членов к определенным областям кода. Чтобы использовать модификатор доступа, вы включаете его ключевое слово в определение членов пакета, класса или объекта, как мы увидим в следующем разделе.
Частные члены
Частный член виден только внутри класса или объекта, содержащего определение члена.
Ниже приведен пример фрагмента кода для объяснения частного члена -
пример
class Outer {
class Inner {
private def f() { println("f") }
class InnerMost {
f() // OK
}
}
(new Inner).f() // Error: f is not accessible
}
В Scala доступ (новый Inner). f () является незаконным, потому что f объявлен закрытым во Inner, и доступ осуществляется не из класса Inner. Напротив, первый доступ к f в классе Innermost нормален, потому что этот доступ содержится в теле класса Inner. Java разрешит оба доступа, поскольку позволяет внешнему классу получать доступ к частным членам своих внутренних классов.
Защищенные члены
Защищенный член доступен только из подклассов класса, в котором он определен.
Ниже приведен пример фрагмента кода для объяснения защищенного члена.
пример
package p {
class Super {
protected def f() { println("f") }
}
class Sub extends Super {
f()
}
class Other {
(new Super).f() // Error: f is not accessible
}
}
Доступ к f в классе Sub в порядке, потому что f объявлен защищенным в классе «Super», а класс «Sub» является подклассом Super. Напротив, доступ к f в классе «Other» не разрешен, потому что класс «Other» не наследуется от класса «Super». В Java последний доступ по-прежнему будет разрешен, потому что класс «Другой» находится в том же пакете, что и класс «Подкласс».
Публичные члены
В отличие от закрытых и защищенных членов, не требуется указывать ключевое слово Public для открытых членов. Для публичных членов нет явного модификатора. К таким членам можно получить доступ откуда угодно.
Ниже приведен пример фрагмента кода для объяснения публичного члена -
пример
class Outer {
class Inner {
def f() { println("f") }
class InnerMost {
f() // OK
}
}
(new Inner).f() // OK because now f() is public
}
Объем защиты
Модификаторы доступа в Scala могут быть дополнены квалификаторами. Модификатор формы private [X] или protected [X] означает, что доступ является частным или защищенным "до" X, где X обозначает некоторый включающий пакет, класс или одноэлементный объект.
Рассмотрим следующий пример -
пример
package society {
package professional {
class Executive {
private[professional] var workDetails = null
private[society] var friends = null
private[this] var secrets = null
def help(another : Executive) {
println(another.workDetails)
println(another.secrets) //ERROR
}
}
}
}
Note - следующие пункты из приведенного выше примера -
Переменная workDetails будет доступна любому классу в прилагаемом пакете professional.
Переменные друзья будут доступны любому классу внутри окружающего пакета.
Секреты переменных будут доступны только для неявного объекта в методах экземпляра (this).