Ключевое слово open

Ключевое слово open используется для разрешения наследования от класса или переопределения методов и свойств. По умолчанию все классы в Kotlin являются финальными (final) и не могут быть унаследованы.

Синтаксис

kotlinopen class ClassName {
  open fun methodName() {
    // method body
  }
  
  open val propertyName: Type = value
}

Пример

Создадим открытый класс Animal с открытым методом:

kotlinopen class Animal {
  open fun makeSound() {
    println("Some sound")
  }
}

class Dog : Animal() {
  override fun makeSound() {
    println("Bark")
  }
}

val dog = Dog()
dog.makeSound()

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

kotlinString "Bark"

Пример

Создадим открытое свойство с возможностью переопределения:

kotlinopen class Vehicle {
  open val maxSpeed: Int = 100
}

class Car : Vehicle() {
  override val maxSpeed: Int = 200
}

val car = Car()
println(car.maxSpeed)

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

kotlinInt 200

Пример

Попытка наследования от финального класса без open вызовет ошибку:

kotlinclass FinalClass {
  fun method() {
    println("Final method")
  }
}

// Error: This type is final, so it cannot be inherited from
// class ChildClass : FinalClass()

Пример

Использование open с абстрактными классами:

kotlinabstract open class AbstractBase {
  open fun concreteMethod() {
    println("Concrete implementation")
  }
  
  abstract fun abstractMethod()
}

class ConcreteClass : AbstractBase() {
  override fun abstractMethod() {
    println("Implemented abstract method")
  }
}

val obj = ConcreteClass()
obj.concreteMethod()
obj.abstractMethod()

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

kotlinString "Concrete implementation"
String "Implemented abstract method"

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

  • ключевое слово class,
    которое объявляет классы
  • ключевое слово abstract,
    которое объявляет абстрактные классы и методы
  • ключевое слово override,
    которое используется для переопределения методов и свойств
  • ключевое слово final,
    которое запрещает дальнейшее переопределение