Kotlino paveldėjimas (su pavyzdžiais)

Šiame straipsnyje sužinosite apie paveldėjimą. Tiksliau, kas yra paveldėjimas ir kaip jį įgyvendinti Kotlin (pavyzdžių pagalba).

Paveldėjimas yra vienas pagrindinių objektinio programavimo bruožų. Tai leidžia vartotojui sukurti naują klasę (išvestinę klasę) iš esamos klasės (pagrindinės klasės).

Išvestinė klasė paveldi visas savybes iš bazinės klasės ir gali turėti papildomų savybių.

Prieš pradėdami išsamiai aprašyti Kotlin paveldėjimą, rekomenduojame patikrinti šiuos du straipsnius:

  • Kotlino klasė ir objektai
  • „Kotlin“ pirminis konstruktorius

Kodėl paveldėjimas?

Tarkime, kad savo paraiškoje norite trijų simbolių - matematikos mokytojo , futbolininko ir verslininko .

Kadangi visi veikėjai yra asmenys, jie gali vaikščioti ir kalbėtis. Tačiau jie taip pat turi tam tikrų specialių įgūdžių. Matematikos mokytojas gali mokyti matematikos , futbolininkas - žaisti futbolą, o verslininkas - verslą .

Galite individualiai sukurti tris klases, kurios gali vaikščioti, kalbėtis ir atlikti savo specialius įgūdžius.

Kiekvienoje klasėje turėtumėte nukopijuoti tą patį kiekvieno simbolio vaikščiojimo ir kalbėjimo kodą.

Jei norite pridėti naują funkciją - valgykite, kiekvienam simboliui turite įdiegti tą patį kodą. Tai gali lengvai tapti klaidomis (kopijuojant) ir kodų dublikatais.

Būtų daug lengviau, jei mes turėtume Personklasę su tokiomis pagrindinėmis savybėmis kaip pokalbis, vaikščiojimas, valgymas, miegas ir prie tų savybių pridėtume specialių įgūdžių, kaip nurodyta mūsų simboliuose. Tai daroma naudojant paveldėjimą.

Naudojant palikimą, dabar jūs neturite įdiegti tą patį kodą walk(), talk()ir eat()kiekvienai klasei. Jums tereikia juos paveldėti .

Taigi MathTeacher(išvestinei klasei) paveldėsite visas Person(pagrindinės klasės) savybes ir pridėsite naują funkciją teachMath(). Taip pat Footballerklasėje jūs paveldėsite visas Personklasės savybes ir pridėsite naują funkciją playFootball()ir pan.

Tai padaro jūsų kodą švaresnį, suprantamesnį ir išplėstinį.

Svarbu atsiminti: dirbant su paveldėjimu, kiekviena išvestinė klasė turėtų atitikti sąlygą, ar ji „yra“ pagrindinė klasė, ar ne. Ankstesniame pavyzdyje MathTeacher yra a Person , Footballer yra a Person . Jūs negalite turėti kažko panašaus, Businessman yra a Business .

Kotlino paveldėjimas

Pabandykime įgyvendinti aukščiau pateiktą diskusiją kode:

 atvira klasė Asmuo (amžius: vidutinis) (// valgymo, kalbėjimo, vaikščiojimo kodas) klasė MathTeacher (amžius: vidutinis): asmuo (amžius) (// kitos matematikos mokytojo savybės) klasė amžius) (// kiti futbolininko bruožai) klasė Verslininkas (amžius: Vidutinis): Asmuo (amžius) (// kiti verslininko bruožai)

Čia Personyra pagrindinės klasės ir klasės MathTeacher, Footballerir Businessmanyra kilęs iš asmens klasėje.

Atkreipkite dėmesį, raktinis žodis openprieš pagrindinę klasę Person,. Tai svarbu.

Pagal numatytuosius nustatymus Kotlino klasės yra galutinės. Jei esate susipažinę su „Java“, žinote, kad paskutinės klasės negalima skirstyti į poklasius. Naudodamas atvirą anotaciją klasėje, kompiliatorius leidžia iš jo išvesti naujas klases.

Pavyzdys: Kotlino paveldėjimas

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

Kai paleisite programą, išvestis bus:

Mano vardas yra Džekas. Mano amžius 25 metai, aš mokau pradinėje mokykloje. Mano vardas Cristiano. Mano amžius 29 metai, žaidžiu „LA Galaxy“.

Čia dvi klasės MathTeacherir Footballeryra kilę iš Personklasės.

Pagrindinis Personklasės konstruktorius deklaravo dvi savybes: amžių ir pavadinimą, ir jame yra inicializatorių blokas. Bazinės klasės iniciatoriaus bloką (ir nario funkcijas) Persongali pasiekti išvestinių klasių objektai ( MathTeacherir Footballer).

Gautas pamokas MathTeacherir Footballerturėti savo valstybes funkcijas teachMaths()ir playFootball()atitinkamai. Šios funkcijos pasiekiamos tik iš atitinkamos klasės objektų.

Sukūrus MathTeacherklasės objektą t1 ,

 val t1 = MathTeacher (25 m., „Džekas“)

Parametrai perduodami pirminiam konstruktoriui. Kotline initblokas vadinamas, kai objektas yra sukurtas. Kadangi MathTeacheryra kilęs iš Personklasės, jis ieško iniciatorių bloko pagrindinėje klasėje (Asmuo) ir jį vykdo. Jei MathTeacherturėjo pradinį bloką, kompiliatorius taip pat būtų įvykdęs išvestinės klasės pradinį bloką.

Tada teachMaths()objekto t1funkcija vadinama naudojant t1.teachMaths()teiginį.

Programa veikia panašiai, kai objektas f1Footballersukurta klasėje. Jis vykdo bazinės klasės init bloką. Tada klasės playFootball()metodas Footballervadinamas naudojant teiginį f1.playFootball().

Svarbios pastabos: Kotlino paveldėjimas

  • Jei klasėje yra pagrindinis konstruktorius, pagrindas turi būti inicializuotas naudojant pirminio konstruktoriaus parametrus. Pirmiau programą, abi gautos klasės turi du parametrus ageir name, ir abu šie parametrai yra inicializuoti pirminėje konstruktorius iš bazinės klasės.
    Štai dar vienas pavyzdys:
     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") )  
    Čia pagrindinis išvestinės klasės konstruktorius turi 3 parametrus, o pagrindinė klasė - 2 parametrus. Atkreipkite dėmesį, kad abu pagrindinės klasės parametrai yra inicijuojami.
  • Jei pirminio konstruktoriaus nėra, kiekviena bazinė klasė turi inicijuoti bazę (naudodama super raktinį žodį) arba perduoti kitam konstruktoriui, kuris tai daro. Pavyzdžiui,
     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) ( ) )
    Norėdami sužinoti daugiau apie šios programos veikimą, apsilankykite „Kotlin“ antriniame konstruktoriuje.

Svarbiausios narių funkcijos ir ypatybės

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

Naudodami superraktinį žodį, galite iškviesti pagrindinės klasės funkcijas (ir prieigos ypatybes) iš išvestinės klasės . Štai kaip:

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

Kai paleisite programą, išvestis bus:

 Mano amžius yra 31. Mano netikras amžius yra 26 metai.

Įdomios straipsniai...