Kotlina mantojums (ar piemēriem)

Šajā rakstā jūs uzzināsiet par mantojumu. Konkrētāk, kas ir mantojums un kā to īstenot Kotlīnā (ar piemēru palīdzību).

Mantošana ir viena no objektorientētās programmēšanas galvenajām iezīmēm. Tas ļauj lietotājam izveidot jaunu klasi (atvasinātu klasi) no esošās klases (bāzes klases).

Atvasinātā klase pārmanto visas pazīmes no bāzes klases, un tai var būt savas papildu pazīmes.

Pirms iedziļināties Kotlin mantojumā, iesakām pārbaudīt šos divus rakstus:

  • Kotlina klase un objekti
  • Kotlina primārais konstruktors

Kāpēc mantojums?

Pieņemsim, ka savā pieteikumā vēlaties trīs rakstzīmes - matemātikas skolotāju , futbolistu un uzņēmēju .

Tā kā visi varoņi ir personas, viņi var staigāt un runāt. Tomēr viņiem ir arī dažas īpašas prasmes. Matemātikas skolotājs var mācīt matemātiku , futbolists var spēlēt futbolu un uzņēmējs var vadīt biznesu .

Jūs varat individuāli izveidot trīs klases, kas var staigāt, runāt un izpildīt savas īpašās prasmes.

Katrā klasē jūs kopējat vienu un to pašu kodu pastaigām un sarunām katram rakstzīmei.

Ja vēlaties pievienot jaunu funkciju - ēdiet, jums jāievieš tas pats kods katrai rakstzīmei. Tas var viegli kļūt par kļūdām (kopējot) un kodu dublikātiem.

Būtu daudz vieglāk, ja mums būtu Personklase ar tādām pamatfunkcijām kā saruna, staigāšana, ēšana, gulēšana un šo funkciju papildināšana ar īpašām prasmēm atbilstoši mūsu rakstzīmēm. Tas tiek darīts, izmantojot mantojumu.

Izmantojot mantojumu, tagad jums nav īstenot tādu pašu kodu walk(), talk()un eat()katrai klasei. Jums vienkārši vajag tos pārmantot .

Tātad MathTeacher(atvasinātajai klasei) jūs mantojat visas Person(bāzes klases) funkcijas un pievienojat jaunu funkciju teachMath(). Tāpat Footballerklasē jūs mantojat visas Personklases funkcijas un pievienojat jaunu funkciju playFootball()utt.

Tas padara jūsu kodu tīrāku, saprotamu un paplašināmu.

Ir svarīgi atcerēties: Strādājot ar mantojumu, katrai atvasinātajai klasei ir jāatbilst nosacījumam, vai tā "ir" bāzes klase vai nē. Iepriekš minētajā piemērā MathTeacher ir a Person , Footballer ir a Person . Jums nevar būt kaut kas līdzīgs, Businessman ir Business .

Kotlina mantojums

Mēģināsim ieviest iepriekš minēto diskusiju kodā:

 atklātā klase Persona (vecums: Int) (// ēšanas, sarunu, pastaigu kods) klase MathTeacher (vecums: Int): Persona (vecums) (// citas matemātikas skolotāja iezīmes) klase Futbolists (vecums: Int): Persona ( vecums) (// citas futbolista pazīmes) klase Uzņēmējs (vecums: vidējais): Persona (vecums) (// citas uzņēmēja iezīmes)

Šeit Personir bāzes klases un klases MathTeacher, Footballerun Businessmanir iegūti no personas klasē.

Paziņojums, atslēgvārds openpirms pamatklases Person,. Tas ir svarīgi.

Pēc noklusējuma klases Kotlinā ir galīgas. Ja jums ir pazīstama Java, jūs zināt, ka pēdējo klasi nevar apakšklasē. Izmantojot klasē atvērto anotāciju, kompilators ļauj no tās iegūt jaunas klases.

Piemērs: Kotlina mantojums

 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() )

Palaidot programmu, izeja būs:

Mani sauc Džeks. Mans vecums ir 25 gadi, es mācu pamatskolā. Mani sauc Krištianu. Mans vecums ir 29 gadi, es spēlēju LA Galaxy komandā.

Šeit divas klases MathTeacherun Footballerir atvasinātas no Personklases.

PersonKlases galvenais konstruktors deklarēja divas īpašības: vecumu un nosaukumu, un tam ir inicializētāja bloks. Bāzes klases iniciatora blokam (un dalībnieka funkcijām) Personvar piekļūt atvasināto klašu ( MathTeacherun Footballer) objekti .

Iegūti nodarbības MathTeacherun Footballerir savas locekļa funkcijas teachMaths()un playFootball()attiecīgi. Šīs funkcijas ir pieejamas tikai no attiecīgās klases objektiem.

Kad MathTeacherir izveidots klases objekts t1 ,

 val t1 = MathTeacher (25, "Džeks")

Parametri tiek nodoti primārajam konstruktoram. Kotlīnā initbloku sauc, kad objekts tiek izveidots. Tā kā MathTeacherir atvasināts no Personklases, tas meklē inicializētāja bloku bāzes klasē (Persona) un to izpilda. Ja MathTeacherbūtu init bloks, kompilators būtu izpildījis arī atvasinātās klases init bloku.

Tālāk teachMaths()objekta funkcija t1tiek izsaukta, izmantojot t1.teachMaths()paziņojumu.

Programma darbojas līdzīgi, ja objekts f1ir Footballerir izveidots klasē. Tas izpilda bāzes klases init bloku. Pēc tam klases playFootball()metodi Footballersauc, izmantojot paziņojumu f1.playFootball().

Svarīgas piezīmes: Kotlina mantojums

  • Ja klasei ir primārais konstruktors, bāze ir jāinicializē, izmantojot primārā konstruktora parametrus. Iepriekš minētajā programmā abām atvasinātajām klasēm ir divi parametri ageun name, un abi šie parametri tiek inicializēti primārajā konstruktorā bāzes klasē.
    Šeit ir vēl viens piemērs:
     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") )  
    Šeit atvasinātās klases primārajam konstruktoram ir 3 parametri, un bāzes klasei ir 2 parametri. Ņemiet vērā, ka abi bāzes klases parametri tiek inicializēti.
  • Ja nav primārā konstruktora, katrai bāzes klasei ir jāinicializē bāze (izmantojot super atslēgvārdu) vai jādeleģē citam konstruktoram, kurš to dara. Piemēram,
     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) ( ) )
    Lai uzzinātu vairāk par šīs programmas darbību, apmeklējiet Kotlin Secondary Constructor.

Dalībnieka funkciju un īpašību ignorēšana

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

Izmantojot superatslēgvārdu, jūs varat izsaukt bāzes klases funkcijas (un piekļuves īpašības) no atvasinātas klases . Lūk, kā:

 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) )

Palaidot programmu, izeja būs:

 Mans vecums ir 31. Mans viltus vecums ir 26.

Interesanti raksti...