English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
В этой статье вы узнаете о 4 типах модификаторов видимости в Kotlin и о том, как они работают в различных ситуациях.
Модификаторы видимости — это ключевые слова, которые используются для установки видимости (доступности) классов, объектов, интерфейсов, конструкторов, функций, свойств и их установщиков (не можно устанавливать видимость getters, так как они всегда имеют такую же видимость, как и свойства)
ВКлассы и объекты в KotlinВ статье вы кратко узнали о модификаторах видимости public и private. В этой статье вы详细了解ете другие модификаторы видимости protected и internal (а также public и private).
Пакет организует группу связанных функций, свойств и классов, объектов и интерфейсов.
модификатор | описание |
---|---|
public | Видно везде |
private | Видимо в файле, содержащем объявление |
internal | Видимо в пределах одного модуля (группа файлов Kotlin, скомпилированных вместе) |
protected | Недоступно для пакета (используется для подклассов) |
Внимание:Если не указан модификатор видимости, то по умолчанию является значением по умолчанию public .
Давайте приведем пример:
// имя файла: hello.kt package test fun function1() {} // по умолчанию является общедоступным и виден везде private fun function2() {} // виден только в hello.kt internal fun function3() {} // виден в одном модуле var name = "Foo" // везде виден get() = field // виден в hello.kt (как и его свойство) private set(value) { // виден только в hello.kt field = value {} private class class1 {} // виден только в hello.kt
Ниже показано, как работают модификаторы видимости для членов классов (функций, свойств) внутри класса:
модификатор | описание |
---|---|
public | виден любому клиенту, видящему объявление класса |
private | только внутри класса виден |
protected | внутри класса и его подклассов виден |
internal | Клиенты, видящие объявление класса в модуле, могут видеть его |
Внимание:Если вы перегружаете protected член в производном классе и не указываете его видимость, то его видимость также будет protected.
Давайте приведем пример:
open class Base() { var a = 1 // по умолчанию общедоступен private var b = 2 // Base класс частный protected open val c = 3 // виден для Base и Derived классов internal val d = 4 // виден в одном модуле protected fun e() {} // виден для Base и Derived классов {} class Derived: Base() { // a, c, d и e() всех свойств класса Base видимы // b невидим override val c = 9 // c является protected {} fun main(args: Array<String>) { val base = Base() //base.a и base.d видимы // base.b, base.c и base.e() невидимы val derived = Derived() // derived.c невидим {}
По умолчанию видимость конструктора public. Но вы можете изменить это. Для этого вам нужно явно добавить ключевое слово constructor.
В следующем примере конструктор по умолчанию public:
class Test(val a: Int) { // code {}
Вы можете изменить его видимость следующим образом.
class Test private constructor(val a: Int) { // code {}
Конструктор в данном случае private.
Внимание: В Kotlin локальные функции, переменные и классы не могут иметь модификаторы видимости.