Mogliście ujrzeć w ostatnich artykułach poruszenie jednego z kolejnych tematów jakim jest klasa "Any" w języku Kotlin. Poświęcimy niniejszy artykuł na nieco bardziej szczegółowe wyjaśnienie tego tematu. Zapraszam do środka!
Tweet |
"ANY" W JĘZYKU KOTLIN ODPOWIADA ZA WSZYSTKIE INNE KLASY
Na początek najprostsza rzecz do opanowania. "Any" to jest nic innego jak klasa "matka" wszystkich pozostałych klas. Odpowiednikiem w Javie jest "Object" i to powinno niektórym rozjaśnić umysł o co chodzi. Jak możecie zdawać sobie sprawę, to oznacza z kolei, że każda klasa bez wyjątku staję się klasą pochodną klasy "Any". To jest fakt! Pokażę teraz pewne detale dotyczące "Any" w języku Kotlin.
DZIEDZICZENIE ZA KULISAMI
Jak już opisywałem jakiś czas temu, dziedziczenie w języku Kotlin polega na wprowadzeniu znaku dwukropka po nazwie naszej klasy, podaniu bezbłędnie nazwy klasy bazowej i pary nawiasów okrągłych (a w środku nich dodatkowo parametry, jeśli są konieczne). Przypomnę zapis kodowy:
class Rectangle : Shape() {
}
"Any" w języku Kotlin jest dziedziczone przez każdą klasę po kryjomu, nawet gdy nie zdefiniujemy tego w sposób jawny. Czyli każda nowo tworzona klasa bez jakiegokolwiek dziedziczenia od innej klasy, w rzeczywistości przyjmuje taką postać:
class NewClass : Any() {
}
efektem czego każda klasa czy tego chce, czy nie, jest klasą pochodną klasy "Any". Jakie to przynosi skutki i jak je możemy wykorzystać?
CO POTRAFI "JAKIKOLWIEK"?
Klasa "Any" w języku Kotlin (tak samo jak "Object" w Javie) udostępnia całej reszcie kilka metod, które mamy prawo przesłonić implementując niestandardowe zachowanie. Przybliżę Wam jedną z nich, choć "Any" posiada trochę więcej.
TOSTRING
Metoda "toString" zwracająca łańcuch znaków przydaje się do przesłaniania literału, zastępując nic niemówiący ciąg na własne dane i tym sposobem przekazując cenne informacje o samej klasie. Na przykład możemy wstawić wartości danych składowych celem porównywania z innymi obiektami, testowania lub debugowania. Co ciekawe, nie trzeba jej wywoływać bezpośrednio jak każdą inną metodę z obiektu, tylko wystarczy podać jego nazwę do funkcji "println".
Popatrzmy na przykład. Mamy punkt w dwuwymiarowym układzie współrzędnych i moglibyśmy chcieć, aby obiekt sam z siebie dostarczał informacji na temat odciętej i rzędnej. Przy użyciu danych składowych dla osi X i Y, możemy wpłynąć na prezentację wartości metody "toString", na przykład tak:
open class Point(tx : Int, ty : Int) {
open var x = tx
open var y = ty
override fun toString(): String {
return "($x, $y)"
}
}
lub jeszcze prościej zamieniając na funkcję jednowyrażeniową:
override fun toString() = "($x, $y)"
Jaki to przyniesie efekt? Tworzymy sobie obiekt, przypisujemy wartości do konstruktora, wywołujemy funkcję "println", wstawiamy za parametr samą nazwę obiektu i oto naszym oczom ukazuje się ustawiony przez nas literał znakowy zawarty w zmodyfikowanej wersji metody "toString".
Klasa "Any" w języku Kotlin to "matka wszystkich innych klas". Każda klasa u której nie zdefiniowano klasy bazowej do dziedziczenia, odziedzicza domyślnie od klasy "Any".
Artykuł o klasie "Any" dobiegł końca. Pamiętajcie że domyślnie, kompilator sam automatycznie przypisuje dziedziczenie każdej nowo tworzonej klasy od klasy "Any", jeśli nie określimy tego samodzielnie.