Модификатор protected

Модификатор protected используется для ограничения видимости членов класса (свойств и методов) только внутри самого класса и его классов-наследников. Защищенные члены не видны извне иерархии наследования, даже если они находятся в том же пакете.

Синтаксис

kotlinprotected var propertyName: Type = value
kotlinprotected val propertyName: Type = value
kotlinprotected fun methodName(parameters): ReturnType {
  // method body
}

Пример

Создадим базовый класс с защищенным свойством и методом:

kotlinopen class Animal {
  protected val species: String = "Mammal"
  
  protected fun makeSound() {
    println("Animal sound")
  }
  
  fun publicMethod() {
    makeSound() // доступно внутри класса
    println(species) // доступно внутри класса
  }
}

Пример

Создадим класс-наследник с доступом к защищенным членам:

kotlinclass Dog : Animal() {
  fun bark() {
    makeSound() // доступно в наследнике
    println("Species: $species") // доступно в наследнике
  }
}

Пример

Попробуем обратиться к защищенным членам извне:

kotlinval animal = Animal()
// animal.makeSound() // Ошибка: protected function
// println(animal.species) // Ошибка: protected property
animal.publicMethod() // Доступно: public function

Результат выполнения кода:

kotlinAnimal sound
Mammal

Пример

Защищенные члены интерфейсов:

kotlininterface MyInterface {
  protected fun interfaceMethod() {
    println("Protected interface method")
  }
}

class MyClass : MyInterface {
  fun test() {
    interfaceMethod() // доступно в реализации
  }
}

Пример

Защищенный конструктор:

kotlinclass Parent protected constructor(val name: String) {
  companion object {
    fun create(): Parent {
      return Parent("Default")
    }
  }
}

// val parent = Parent("Test") // Ошибка: protected constructor
val parent = Parent.create() // Доступно через фабричный метод

Смотрите также

  • ключевое слово public,
    которое обеспечивает публичную видимость членов класса
  • ключевое слово private,
    которое ограничивает видимость членов класса только самим классом
  • ключевое слово internal,
    которое ограничивает видимость членов класса пределами модуля
  • ключевое слово class,
    которое используется для объявления классов