В этой статье вы узнаете обо всех 4 модификаторах видимости в Kotlin и о том, как они работают в разных сценариях.
Модификаторы видимости - это ключевые слова, которые устанавливают видимость (доступность) классов, объектов, интерфейса, конструкторов, функций, свойств и их установщиков. (Вы не можете установить модификатор видимости геттеров, поскольку они всегда принимают ту же видимость, что и свойство.)
В Котлин класса и объекты статье вы узнали о модификаторов видимости public
и private
вкратце. Вы узнаете еще о двух модификаторах видимости protected
и internal
(а также о public
и private
) более подробно.
Модификаторы видимости внутри пакета
Пакет организует набор связанных функций, свойств и классов, объектов и интерфейсов. Рекомендуемая литература: Пакеты Kotlin
Модификатор | Описание |
---|---|
общественный | объявления видны везде |
частный | виден внутри файла, содержащего объявление |
внутренний | видимый внутри того же модуля (набор файлов Kotlin, скомпилированных вместе) |
защищенный | недоступно для пакетов (используется для подклассов) |
Примечание. Если модификатор видимости не указан, он используется 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
Модификаторы видимости внутри классов и интерфейсов
Вот как модификаторы видимости работают для членов (функций, свойств), объявленных внутри класса:
Модификатор | Описание |
---|---|
общественный | виден любому клиенту, который может видеть объявляющий класс |
частный | виден только внутри класса |
защищенный | видимый внутри класса и его подклассов |
внутренний | видимый для любого клиента внутри модуля, который может видеть объявляющий класс |
Примечание. Если вы переопределите protected
член в производном классе без указания его видимости, его видимость также будет protected
.
Возьмем пример:
open class Base () (var a = 1 // общедоступный по умолчанию private var b = 2 // закрытый для базового класса защищенный открытый val c = 3 // видимый для базового и производного класса внутренний val d = 4 // видимый внутри одного модуля protected fun e () () // видимый для базового и производного классов) class Derived: Base () (// a, c, d и e () базового класса видны // b не отображается override val c = 9 // c защищен) fun main (args: Array) (val base = Base () // base.a и base.d видны // base.b, base.c и base .e () не видны val производные = Derived () // производные .c не видны)
Изменение видимости конструктора
По умолчанию видимость конструктора равна public
. Однако вы можете это изменить. Для этого вам нужно явно добавить constructor
ключевое слово.
В public
примере ниже конструктор по умолчанию:
class Test (val a: Int) (// код)
Вот как вы можете изменить его видимость.
class Test частный конструктор (val a: Int) (// код)
Вот конструктор private
.
Примечание. В Kotlin локальные функции, переменные и классы не могут иметь модификаторы видимости.