Kotlini pärand (koos näidetega)

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 Personklass, 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 MathTeacherpärite (tuletatud klassi) jaoks kõik Person(baasklassi) funktsioonid ja lisate uue funktsiooni teachMath(). Samamoodi Footballerpärite klassi jaoks kõik klassi tunnused Personja 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 Personon alus klassi ja klassi MathTeacher, Footballerning Businessmanpärinevad Isiku klassi.

Teate, märksõna openenne 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 MathTeacherja Footballeron tuletatud Personklassist.

PersonKlassi esmane konstruktor deklareeris kaks omadust: vanus ja nimi ning sellel on initsiaatori plokk. Põhiklassi initsiaatoriplokile (ja liikmefunktsioonidele) Personpääsevad juurde tuletatud klasside ( MathTeacherja Footballer) objektid .

Tuletatud klassi MathTeacherja Footballeron oma liikme ülesannete teachMaths()ja playFootball()vastavalt. Need funktsioonid on ligipääsetavad ainult vastava klassi objektidelt.

Kui MathTeacherklassi objekt t1 on loodud,

 val t1 = MathTeacher (25, "Jack")

Parameetrid edastatakse esmasele konstruktorile. Kotlinis initkutsutakse objekti loomisel plokki. Kuna, MathTeacheron tuletatud Personklassist, otsib ta algklass algklassis (Isik) ja täidab selle. Kui MathTeacherinit-plokk oleks olnud, oleks kompilaator käivitanud ka tuletatud klassi init-ploki.

Järgmisena kutsutakse teachMaths()objekti t1funktsiooni t1.teachMaths()lause abil.

Programm töötab sarnaselt f1ka Footballerklassi objekti loomisel. See täidab baasklassi init-ploki. Seejärel nimetatakse klassi playFootball()meetodit Footballerlause 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 ageja namening 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") )  
    Siin on tuletatud klassi peamisel konstruktoril 3 parameetrit ja baasklassil 2 parameetrit. Pange tähele, et mõlemad baasklassi parameetrid lähtestatakse.
  • 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) ( ) )
    Selle programmi toimimise kohta lisateabe saamiseks külastage Kotlini keskkonstruktorit.

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

superMä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.

Huvitavad Artiklid...