Słowo kluczowe override w Kotlin jest używane do wyraźnego oznaczania nadpisywania metod i właściwości klasy bazowej lub interfejsu.
W Javie można nadpisywać metody klasy bazowej bez słowa kluczowego, co czasami może prowadzić do błędów lub literówek. W Kotlin, kierując się zasadą bezpieczeństwa, należy zawsze określać override dla wszelkich nadpisywań i open dla samego członka klasy bazowej.
Ryzyko przypadkowego ukrywania metod klasy bazowej (accidental overriding) oraz potrzeba wyraźnego zarządzania dziedziczonymi członami. Ponadto, nadpisywane metody muszą być oznaczone jako open, w przeciwnym razie nie można ich nadpisać bez błędu kompilacji.
Użycie słowa kluczowego override dla metod i właściwości klasy bazowej lub interfejsu, które wcześniej zostały oznaczone jako open, abstract lub już override.
Przykład kodu:
open class Animal { open fun sound() = "???" } class Dog : Animal() { override fun sound() = "Woof!" }
Kluczowe cechy:
override nie można nadpisać metody — pojawi się błąd kompilacji;final do metod, można nadpisać tylko to, co jest wyraźnie oznaczone jako open;override wspiera wielodziedziczenie przez interfejsy i klasy.Czy można nadpisać właściwość lub metodę, jeśli nie jest oznaczona jako open/abstract/override?
Nie, tylko członkowie wyraźnie oznaczeni open/abstract/override mogą być nadpisywani w podklasie.
Czy override jest konieczne przy implementacji metody interfejsu?
Tak, zawsze, nawet jeśli jest to pierwszy poziom implementacji, override jest konieczne — taki jest składnik Kotlin dla jednolitości.
Czy metoda oznaczona jako override może być dalej nadpisywana?
Tak, jeśli metoda nie jest oznaczona jako final (domyślnie override dziedziczy open), to można ją również nadpisywać w dalszej hierarchii.
Programista zapomina oznaczyć open w klasie bazowej:
class Cat { fun meow() = "meow" } class Tiger: Cat() { override fun meow() = "ROAR" // błąd kompilacji }
Zalety:
Wady:
Prawidłowe określenie klasy i zamiaru dziedziczenia:
open class Cat { open fun meow() = "meow" } class Tiger: Cat() { override fun meow() = "ROAR" }
Zalety:
Wady: