Domyślnie wszystkie klasy, metody i właściwości w Kotlinie są finalne (final). Oznacza to, że nie mogą być dziedziczone ani nadpisywane, jeśli nie wskaźemy jawnie modyfikatora open.
Słowo kluczowe open zezwala na dziedziczenie klasy lub nadpisywanie metody. To podstawowa różnica w porównaniu do Javy, gdzie klasy są domyślnie otwarte na dziedziczenie.
Przykład:
open class Animal { open fun sayHello() { println("Witaj z Animal!") } } class Dog : Animal() { override fun sayHello() { println("Hau!") } }
open z klasy Animal — próba dziedziczenia spowoduje błąd kompilacji.override jest obowiązkowe dla metod/właściwości, które chcesz nadpisać.interface i nie wymagają open.Czy w Kotlinie można dziedziczyć dowolną klasę tak samo jak w Javie?
Odpowiedź: Nie, tylko klasy oznaczone jako open (lub abstract). Zwykłe klasy są finalne i nie mogą być dziedziczone. Zostało to wprowadzone w celu zwiększenia bezpieczeństwa i przewidywalności kodu.
Przykład błędnego kodu:
class Animal class Dog : Animal() // Błąd kompilacji: "Animal" jest finalne
Historia
W projekcie na platformę Android młody programista próbował dziedziczyć komponent użytkownika od niestandardowej klasy View, zapominając dodać open. Budowa zawiodła, przyczyna była niejasna, a terminy się opóźniły. Problem został wykryty dopiero po dokładnym przeczytaniu komunikatu kompilatora.
Historia
Podczas opracowywania SDK specyfikacja wymagała rozszerzalnej klasy bazowej, ale została zadeklarowana bez open. Po dostarczeniu do klientów okazało się, że biblioteka nie może być rozszerzana bez zmian w kodzie źródłowym. Konieczne było wydanie aktualizacji.
Historia
W jednym z projektów stary kod Java został przeniesiony do Kotlin, zapominając o domyślnej zamkniętości klas. Większość testów jednostkowych, które używały moki, przestała się kompilować, co spowolniło proces wydania. Dopiero po masowym dodaniu open problem został rozwiązany.