Selles artiklis saate teada pärimise kohta. Täpsemalt, mis on pärimine ja kuidas seda Kotlinis rakendada (näidete toel).
Pärand on üks objektorienteeritud programmeerimise põhijooni. See võimaldab kasutajal luua olemasolevast klassist (baasklassist) uue klassi (tuletatud klassi).
Tuletatud klass pärib kõik tunnused baasklassist ja sellel võib olla omaette omadusi.
Enne Kotlini pärimise üksikasjade uurimist soovitame teil kontrollida neid kahte artiklit:
- Kotlini klass ja esemed
- Kotlini esmane ehitaja
Miks pärimine?
Oletame, et soovite oma rakenduses kolme märki - matemaatikaõpetajat , jalgpallurit ja ärimeest .
Kuna kõik tegelased on isikud, saavad nad kõndida ja rääkida. Kuid neil on ka mõned erilised oskused. Matemaatikaõpetaja saab õpetada matemaatikat , jalgpallur võib mängida jalgpalli ja ärimees ajada äri .
Saate eraldi luua kolm klassi, kes saavad kõndida, rääkida ja oma erioskusi täita.
Igas klassis kopeerite iga tähemärgi jaoks sama kõndimise ja rääkimise koodi.
Kui soovite lisada uue funktsiooni - sööge, peate iga tähemärgi jaoks rakendama sama koodi. See võib kergesti muutuda veaohtlikuks (kopeerimisel) ja koodide duplikaadiks.
Oleks palju lihtsam, kui meil oleks Person
klass, kus on põhifunktsioonid, nagu rääkimine, kõndimine, söömine, magamine ja nende funktsioonide lisamine vastavalt meie tegelastele. Selleks kasutatakse pärimist.
Kasutades pärandist, nüüd ei rakenda sama kood walk()
, talk()
ja eat()
iga klassi. Peate need lihtsalt pärima .
Seega MathTeacher
pärite (tuletatud klassi) jaoks kõik Person
(baasklassi) funktsioonid ja lisate uue funktsiooni teachMath()
. Samamoodi Footballer
pärite klassi jaoks kõik klassi tunnused Person
ja lisate uue funktsiooni playFootball()
jne.
See muudab teie koodi puhtamaks, arusaadavaks ja laiendatavaks.
Oluline on meeles pidada: Pärimisega töötamisel peaks iga tuletatud klass vastama tingimusele, kas see on " põhiklass" või mitte. Ülaltoodud näites MathTeacher
on a Person
, Footballer
on a Person
. Teil ei saa olla midagi sellist, Businessman
on a Business
.
Kotlini pärand
Proovime ülaltoodud arutelu rakendada koodis:
avatud klass Inimene (vanus: keskmine) (// söömise, rääkimise, kõndimise kood) klass MathTeacher (vanus: keskmine): inimene (vanus) (// muud matemaatikaõpetaja tunnused) klass Jalgpallur (vanus: keskmine): inimene ( vanus) (// jalgpalluri muud omadused) klass Ärimees (vanus: keskmine): Isik (vanus) (// muud ärimehe tunnused)
Siin Person
on alus klassi ja klassi MathTeacher
, Footballer
ning Businessman
pärinevad Isiku klassi.
Teate, märksõna open
enne aluse klassi Person
. See on tähtis.
Vaikimisi on Kotlini tunnid lõplikud. Kui olete Java-ga tuttav, teate, et viimast klassi ei saa alamklassidesse liigitada. Kasutades klassis avatud märkust, võimaldab kompilaator sellest tuletada uusi klasse.
Näide: Kotlini pärand
open class Person(age: Int, name: String) ( init ( println("My name is $name.") println("My age is $age") ) ) class MathTeacher(age: Int, name: String): Person(age, name) ( fun teachMaths() ( println("I teach in primary school.") ) ) class Footballer(age: Int, name: String): Person(age, name) ( fun playFootball() ( println("I play for LA Galaxy.") ) ) fun main(args: Array) ( val t1 = MathTeacher(25, "Jack") t1.teachMaths() println() val f1 = Footballer(29, "Christiano") f1.playFootball() )
Programmi käivitamisel on väljund järgmine:
Minu nimi on Jack. Minu vanus on 25 aastat, õpetan põhikoolis. Minu nimi on Cristiano. Minu vanus on 29, mängin LA Galaxy meeskonnas.
Siin kaks klassi MathTeacher
ja Footballer
on tuletatud Person
klassist.
Person
Klassi esmane konstruktor deklareeris kaks omadust: vanus ja nimi ning sellel on initsiaatori plokk. Põhiklassi initsiaatoriplokile (ja liikmefunktsioonidele) Person
pääsevad juurde tuletatud klasside ( MathTeacher
ja Footballer
) objektid .
Tuletatud klassi MathTeacher
ja Footballer
on oma liikme ülesannete teachMaths()
ja playFootball()
vastavalt. Need funktsioonid on ligipääsetavad ainult vastava klassi objektidelt.
Kui MathTeacher
klassi objekt t1 on loodud,
val t1 = MathTeacher (25, "Jack")
Parameetrid edastatakse esmasele konstruktorile. Kotlinis init
kutsutakse objekti loomisel plokki. Kuna, MathTeacher
on tuletatud Person
klassist, otsib ta algklass algklassis (Isik) ja täidab selle. Kui MathTeacher
init-plokk oleks olnud, oleks kompilaator käivitanud ka tuletatud klassi init-ploki.
Järgmisena kutsutakse teachMaths()
objekti t1
funktsiooni t1.teachMaths()
lause abil.
Programm töötab sarnaselt f1
ka Footballer
klassi objekti loomisel. See täidab baasklassi init-ploki. Seejärel nimetatakse klassi playFootball()
meetodit Footballer
lause kasutades f1.playFootball()
.
Olulised märkused: Kotlini pärand
- Kui klassil on esmane konstruktor, tuleb alus lähtestada esmase konstruktori parameetrite abil. Ülaltoodud programmi raames nii tuletatud klassid on kaks parameetrit
age
janame
ning mõlemad need parameetrid on lähtestatud esmane konstruktori baasklass.
Siin on veel üks näide:open class Person(age: Int, name: String) ( // some code ) class Footballer(age: Int, name: String, club: String): Person(age, name) ( init ( println("Football player $name of age $age and plays for $club.") ) fun playFootball() ( println("I am playing football.") ) ) fun main(args: Array) ( val f1 = Footballer(29, "Cristiano", "LA Galaxy") )
- Kui primaarkonstruktorit pole, peab iga baasklass alustama baasi (kasutades super märksõna) või delegeerima teisele konstruktorile, kes seda teeb. Näiteks,
fun main(args: Array) ( val p1 = AuthLog("Bad Password") ) open class Log ( var data: String = "" var numberOfData = 0 constructor(_data: String) ( ) constructor(_data: String, _numberOfData: Int) ( data = _data numberOfData = _numberOfData println("$data: $numberOfData times") ) ) class AuthLog: Log ( constructor(_data: String): this("From AuthLog -> + $_data", 10) ( ) constructor(_data: String, _numberOfData: Int): super(_data, _numberOfData) ( ) )
Liikme funktsioonide ja omaduste ülimuslikkus
If the base class and the derived class contains a member function (or property) with the same name, you can need to override the member function of the derived class using override
keyword, and use open
keyword for the member function of the base class.
Example: Overriding Member Function
// Empty primary constructor open class Person() ( open fun displayAge(age: Int) ( println("My age is $age.") ) ) class Girl: Person() ( override fun displayAge(age: Int) ( println("My fake age is $(age - 5).") ) ) fun main(args: Array) ( val girl = Girl() girl.displayAge(31) )
When you run the program, the output will be:
My fake age is 26.
Here, girl.displayAge(31)
calls the displayAge()
method of the derived class Girl
.
You can override property of the base class in similar way.
Visit how Kotlin getters and setters work in Kotlin before you check the example below.
// Empty primary constructor open class Person() ( open var age: Int = 0 get() = field set(value) ( field = value ) ) class Girl: Person() ( override var age: Int = 0 get() = field set(value) ( field = value - 5 ) ) fun main(args: Array) ( val girl = Girl() girl.age = 31 println("My fake age is $(girl.age).") )
When you run the program, the output will be:
My fake age is 26.
As you can see, we have used override
and open
keywords for age property in derived class and base class respectively.
Calling Members of Base Class from Derived Class
super
Märksõna abil saate tuletatud klassist kutsuda põhiklassi funktsioone (ja juurdepääsuomadusi) . Nii toimige järgmiselt.
open class Person() ( open fun displayAge(age: Int) ( println("My actual age is $age.") ) ) class Girl: Person() ( override fun displayAge(age: Int) ( // calling function of base class super.displayAge(age) println("My fake age is $(age - 5).") ) ) fun main(args: Array) ( val girl = Girl() girl.displayAge(31) )
Programmi käivitamisel on väljund järgmine:
Minu vanus on 31. Minu võlts vanus on 26.