W tym artykule dowiesz się o klasie abstrakcyjnej i jak ją zaimplementować w Kotlinie (na przykładach).
Podobnie jak Java, abstract
słowo kluczowe służy do deklarowania klas abstrakcyjnych w Kotlin. Nie można utworzyć instancji klasy abstrakcyjnej (nie można tworzyć obiektów klasy abstrakcyjnej). Możesz jednak dziedziczyć podklasy z can them.
Elementy członkowskie (właściwości i metody) klasy abstrakcyjnej nie są abstrakcyjne, chyba że jawnie użyjesz abstract
słowa kluczowego, aby uczynić je abstrakcyjnymi. Weźmy przykład:
abstract class Person (var age: Int = 40 fun displaySSN (ssn: Int) (println ("Mój numer SSN to $ ssn.")) abstract fun displayJob (description: String))
Tutaj,
Person
tworzona jest klasa abstrakcyjna . Nie możesz tworzyć obiektów tej klasy.- klasa ma nieabstrakcyjny wiek właściwości i nieabstrakcyjną metodę
displaySSN()
. Jeśli chcesz nadpisać te elementy w podklasie, należy je oznaczyćopen
słowem kluczowym. - Klasa ma metodę abstrakcyjną
displayJob()
. Nie ma żadnej implementacji i musi zostać zastąpiony w swoich podklasach.
Uwaga: zajęcia abstrakcyjne są zawsze otwarte. Nie musisz jawnie używać open
słowa kluczowego, aby dziedziczyć z nich podklasy.
Przykład: Klasa abstrakcyjna Kotlin i metoda
abstract class Person(name: String) ( init ( println("My name is $name.") ) fun displaySSN(ssn: Int) ( println("My SSN is $ssn.") ) abstract fun displayJob(description: String) ) class Teacher(name: String): Person(name) ( override fun displayJob(description: String) ( println(description) ) ) fun main(args: Array) ( val jack = Teacher("Jack Smith") jack.displayJob("I'm a mathematics teacher.") jack.displaySSN(23123) )
Po uruchomieniu programu wynik będzie następujący:
Nazywam się Jack Smith. Jestem nauczycielem matematyki. Mój numer SSN to 23123.
Tutaj klasa Teacher
pochodzi z klasy abstrakcyjnej Person
.
Tworzona jest instancja obiektu jack klasy Teacher. Podczas tworzenia przekazaliśmy "Jack Smith"
jako parametr do konstruktora głównego. Spowoduje to wykonanie bloku inicjalizatora Person
klasy.
Następnie displayJob()
wywoływana jest metoda przy użyciu obiektu jack. Należy zauważyć, że displayJob()
metoda jest zadeklarowana jako abstrakcyjna w klasie bazowej i zastąpiona w klasie pochodnej.
Na koniec displaySSN()
metoda jest wywoływana za pomocą obiektu jack. Metoda nie jest abstrakcyjna i zadeklarowana w klasie Person (i nie została zadeklarowana w Teacher
klasie).
Zalecana lektura: interfejsy Kotlin
Interfejsy Kotlin są podobne do klas abstrakcyjnych. Jednak interfejsy nie mogą przechowywać stanu, podczas gdy klasy abstrakcyjne mogą.
Oznacza to, że interfejs może mieć właściwość, ale musi być abstrakcyjny lub musi zapewniać implementacje akcesorów. Natomiast nie jest obowiązkowe, aby własność klasy abstrakcyjnej była abstrakcyjna.