Nasljeđivanje Kotlina (s primjerima)

U ovom ćete članku naučiti o nasljeđivanju. Točnije, što je nasljeđivanje i kako ga primijeniti u Kotlinu (uz pomoć primjera).

Nasljeđivanje je jedna od ključnih značajki objektno orijentiranog programiranja. Omogućuje korisniku stvaranje nove klase (izvedene klase) od postojeće klase (bazne klase).

Izvedena klasa nasljeđuje sve značajke iz osnovne klase i može imati vlastite dodatne značajke.

Prije ulaska u detalje o nasljeđivanju Kotlina, preporučujemo vam da pogledate ova dva članka:

  • Razred i predmeti Kotlin
  • Primarni konstruktor Kotlin

Zašto nasljedstvo?

Pretpostavimo da u svojoj prijavi želite tri lika - učitelja matematike , nogometaša i poslovnog čovjeka .

Budući da su svi likovi osobe, mogu hodati i razgovarati. Međutim, oni imaju i neke posebne vještine. Učitelj matematike može predavati matematiku , nogometaš može igrati nogomet , a poslovni čovjek voditi posao .

Možete pojedinačno stvoriti tri razreda koji mogu hodati, razgovarati i izvoditi svoje posebne vještine.

U svakom od predavanja kopirali biste isti kod za šetnju i razgovor za svakog lika.

Ako želite dodati novu značajku - jesti, morate primijeniti isti kod za svaki znak. To lako može postati sklono pogreškama (prilikom kopiranja) i dupliciranim kodovima.

Bilo bi puno lakše kada bismo imali Personnastavu s osnovnim značajkama poput razgovora, hodanja, jedenja, spavanja i dodavanja posebnih vještina tim značajkama prema našim likovima. To se radi nasljeđivanjem.

Korištenje baštinu, sada ne provode isti kod za walk(), talk()a eat()za svaki razred. Samo ih trebate naslijediti .

Dakle, za MathTeacher(izvedena klasa) nasljeđujete sve značajke Person(osnovne klase) i dodajete novu značajku teachMath(). Isto tako, za Footballerrazred nasljeđujete sve značajke Personrazreda, dodajete novu značajku playFootball()i tako dalje.

To vaš kod čini čišćim, razumljivim i proširivim.

Važno je zapamtiti: Kada radite s nasljeđivanjem, svaka izvedena klasa treba zadovoljiti uvjet je li " osnovna klasa" ili ne. U gornjem primjeru MathTeacher je a Person , Footballer je a Person . Ne možete imati nešto poput, Businessman je a Business .

Baština Kotlin

Pokušajmo gornju raspravu implementirati u kod:

 otvoreni razred Osoba (dob: Int) (// kod za jelo, razgovor, hodanje) razred MathTeacher (dob: Int): Osoba (dob) (// ostale značajke učitelja matematike) klasa Nogometaš (dob: Int): Osoba ( dob) (// ostale značajke nogometaša) klasa Poslovni čovjek (dob: Int): Osoba (dob) (// ostale značajke poslovnog čovjeka)

Ovdje Personje osnovna klasa i klasa MathTeacher, Footballeri Businessmanizvedeni od osobe klase.

Obavijest, ključna riječ openprije bazne klase, Person. Važno je.

Prema zadanim postavkama, nastava u Kotlinu je konačna. Ako ste upoznati s Javom, znate da se završna klasa ne može podrazvrstati. Korištenjem otvorene bilješke na klasi, kompajler vam omogućuje da iz nje izvedete nove klase.

Primjer: Nasljeđivanje Kotlina

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

Kada pokrenete program, izlaz će biti:

Moje ime je Jack. Moje godine su 25, predajem u osnovnoj školi. Zovem se Cristiano. Moje godine su 29 igram za LA Galaxy.

Ovdje su dvije klase MathTeacheri Footballerizvedene su iz Personklase.

Primarni konstruktor Personklase proglasio je dva svojstva: dob i ime i ima blok inicijalizatora. Blokovima inicijatora (i funkcijama člana) osnovne klase Personmogu pristupiti objekti izvedenih klasa ( MathTeacheri Footballer).

Izvedene klase MathTeacheri Footballerimaju vlastite funkcije člana teachMaths()i playFootball(). Te su funkcije dostupne samo iz objekata njihove klase.

Kada MathTeacherse kreira objekt t1 klase,

 val t1 = MathTeacher (25, "Jack")

Parametri se prosljeđuju primarnom konstruktoru. U Kotlinu se initblok poziva kada se objekt kreira. Budući da MathTeacherje izvedeno iz Personklase, traži blok inicijalizatora u osnovnoj klasi (Osoba) i izvršava ga. Da je MathTeacherimao init blok, kompajler bi također izvršio init blok izvedene klase.

Dalje se teachMaths()funkcija objekta t1poziva pomoću t1.teachMaths()naredbe.

Program radi na sličan način, kada objekt f1od Footballerkreira klase. Izvršava init blok osnovne klase. Zatim se playFootball()metoda Footballerklase poziva pomoću naredbe f1.playFootball().

Važne napomene: Kotlin Inheritance

  • Ako klasa ima primarni konstruktor, baza se mora inicijalizirati pomoću parametara primarnog konstruktora. U gornjem programu, obje izvedene klase imaju dva parametra agei name, i oba su parametra inicijalizirana u primarnom konstruktoru u osnovnoj klasi.
    Evo još jednog primjera:
     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") )  
    Ovdje primarni konstruktor izvedene klase ima 3 parametra, a osnovna klasa ima 2 parametra. Imajte na umu da su oba parametra osnovne klase inicijalizirana.
  • U slučaju da nema primarnog konstruktora, svaka osnovna klasa mora inicijalizirati bazu (pomoću super ključne riječi) ili delegirati drugom konstruktoru koji to radi. Na primjer,
     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) ( ) )
    Da biste saznali više o načinu funkcioniranja ovog programa, posjetite Kotlin Secondary Constructor.

Nadjačavanje funkcija i svojstava članova

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

Pomoću superključne riječi možete pozvati funkcije (i pristupiti svojstvima) osnovne klase iz izvedene klase . Evo kako:

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

Kada pokrenete program, izlaz će biti:

 Moje godine su 31. Moje lažne godine su 26.

Zanimljivi članci...