Sobes.tech
Junior

Kako funkcioniše nasledjivanje u Kotlinu?

sobes.tech АИ

Одговор од АИ

Наслеђивање у Kotlin-у се заснива на принципу отворених класа. По подразумеванию, сви класи су затворени (final), и да бисте направили клас наследивим, морате га јасно означити кључном речи open.

Главне тачке:

  • Отворени класи: Родитељски клас мора бити означен као open.
    open class Base {
        // ...
    }
    
  • Наслеђивање: Наслеђивање се врши помоћу двоеточја (:), након којег следи име родитељског класа и, ако је потребно, позив његовог конструктора.
    class Derived : Base() {
        // ...
    }
    
  • Преоптерећење метода и својстава: За преоптерећење метода или својстава родитељског класа, они морају бити означени као open, а у класи која наследи користи се кључна реч override.
    open class Base {
        open fun process() { /* ... */ }
        open val value: Int = 0
    }
    
    class Derived : Base() {
        override fun process() { /* ... */ }
        override val value: Int = 1
    }
    
    Ако родитељска метода или својство нису означени као open, не могу се преоптерећивати.
  • Приступ члановима родитељског класа: Приступ члановима родитељског класа из класе која наследи врши се помоћу кључне речи super.
    class Derived : Base() {
        override fun process() {
            super.process() // Позив методе родитељског класа
            // ...
        }
    }
    
  • Конструктори: Ако родитељски клас има конструктор са параметрима, класа која наследи мора позвати тај конструктор у својој декларацији.
    open class Base(name: String) {
        // ...
    }
    
    class Derived(name: String, age: Int) : Base(name) {
        // ...
    }
    
  • Интерфејси: Класа може реализовати више интерфејса, који се могу навести након наследног класа, раздвојени зарезом. Интерфејси су подразумевано "отворени" за реализацију.
    interface MyInterface {
        fun doSomething()
    }
    
    class MyClass : Base(), MyInterface {
        override fun doSomething() { /* ... */ }
    }
    
  • Абрактне класе: Абстрактне класе служе за дефинисање делимичне реализације и садрже абстрактне методе и својства (означене са abstract), које морају бити реализоване у класи која наследи. Абстрактни чланови не захтевају open. Абстрактна класа такође не захтева open за наследство.
    abstract class AbsBase {
        abstract fun abstractMethod()
        open fun concreteMethod() { /* ... */ }
    }
    
    class AbsDerived : AbsBase() {
        override fun abstractMethod() { /* ... */ }
    }
    

У целини, Kotlin тежи јасности, захтевајући коришћење open за дозвољавање наследства и преоптерећења.