Наслеђивање Котлина (са примерима)

У овом чланку ћете сазнати о наслеђивању. Конкретније, шта је наследство и како га применити у Котлину (уз помоћ примера).

Наслеђивање је једна од кључних карактеристика објектно оријентисаног програмирања. Омогућава кориснику да креира нову класу (изведена класа) од постојеће класе (основна класа).

Изведена класа наслеђује све карактеристике основне класе и може имати сопствене додатне карактеристике.

Пре него што улазите у детаље о наследству Котлина, препоручујемо вам да погледате ова два чланка:

  • Котлин класа и предмети
  • Примарни конструктор Котлин

Зашто наследство?

Претпоставимо да у својој пријави желите три лика - наставника математике , фудбалера и бизнисмена .

Будући да су сви ликови особе, могу да ходају и разговарају. Међутим, они такође имају неке посебне вештине. Учитељ математике може да предаје математику , фудбалер може да игра фудбал , а бизнисмен да води посао .

Можете појединачно да направите три разреда који могу да ходају, разговарају и изводе своје посебне вештине.

У сваком одељењу копирали бисте исти код за шетњу и разговор за сваког лика.

Ако желите да додате нову функцију - јести, мораћете да примените исти код за сваки знак. Ово лако може постати склоно грешкама (при копирању) и дупликатима кодова.

Било би много лакше када бисмо имали Personчас са основним карактеристикама као што су разговор, ходање, јело, спавање и додавање посебних вештина тим карактеристикама према нашим ликовима. То се ради наслеђивањем.

Користећи наслеђе, сада не спроводе исти код за walk(), talk()и eat()за сваку класу. Само их треба наследити .

Дакле, за MathTeacher(изведена класа) наследите све карактеристике Person(основне класе) и додате нову особину teachMath(). Исто тако, за Footballerкласу наследите све карактеристике Personкласе, додате нову особину playFootball()и тако даље.

То ваш код чини чишћим, разумљивим и проширивим.

Важно је запамтити: Када радите са наслеђивањем, свака изведена класа треба да задовољи услов да ли је „ основна класа“ или не. У горњем примеру MathTeacher је а Person , Footballer је а Person . Не можете имати нешто попут, Businessman је а Business .

Баштина Котлин

Покушајмо да применимо горњу дискусију у коду:

 отворени разред Персон (узраст: Инт) (// код за јело, разговор, ходање) час МатхТеацхер (узраст: Инт): Персон (узраст) (// остале карактеристике наставника математике) час Фудбалер (узраст: Инт): Персон ( старост) (// остале карактеристике фудбалера) класа Бизнисмен (старост: Инт): Особа (старост) (// остале особине бизнисмена)

Овде, Personје основна класа и класе MathTeacher, Footballerи Businessmanизводе из класе Персон.

Обавештење, кључна реч openпре основне класе, Person. Је важно.

Подразумевано су часови у Котлину коначни. Ако сте упознати са Јавом, знате да се коначна класа не може поткласирати. Коришћењем отворене напомене за класу, компајлер вам омогућава да из ње изведете нове класе.

Пример: Котлин наследство

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

Када покренете програм, излаз ће бити:

Зовем се Џек. Моје године су 25 и предајем у основној школи. Зовем се Цристиано. Имам 29 година и играм за ЛА Галаки.

Овде су две класе MathTeacherи Footballerизведене су из Personкласе.

Примарни конструктор Personкласе је прогласио два својства: старост и име и има блок иницијализатора. Блоковима иницијатора (и функцијама члана) основне класе Personмогу приступити објекти изведених класа ( MathTeacherи Footballer).

Изведене класе MathTeacherи Footballerимају своје функције члана teachMaths(), playFootball()односно. Овим функцијама могу се приступити само из објеката њихове класе.

Када MathTeacherсе креира објекат класе т1 ,

 вал т1 = МатхТеацхер (25, "Јацк")

Параметри се преносе примарном конструктору. У Котлину се initблок позива када се објекат креира. Будући да MathTeacherје изведено из Personкласе, тражи блок иницијализатора у основној класи (Персон) и извршава га. Да је MathTeacherимао инит блок, компајлер би такође извршио инит блок изведене класе.

Даље се teachMaths()функција објекта t1позива помоћу t1.teachMaths()наредбе.

Програм ради на сличан начин када објекат f1од Footballerнастаје класе. Извршава инит блок основне класе. Затим се playFootball()метод Footballerкласе позива помоћу наредбе f1.playFootball().

Важне напомене: Котлин Инхеританце

  • Ако класа има примарни конструктор, база мора бити иницијализована помоћу параметара примарног конструктора. У горњем програму обе изведене класе имају два параметра ageи name, и оба ова параметра су иницијализована у примарном конструктору у основној класи.
    Ево још једног примера:
     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") )  
    Овде примарни конструктор изведене класе има 3 параметра, а основна класа има 2 параметра. Имајте на уму да су оба параметра основне класе иницијализована.
  • У случају да нема примарног конструктора, свака основна класа мора да иницијализује базу (користећи супер кључну реч) или да је делегира другом конструктору који то ради. На пример,
     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) ( ) )
    Да бисте сазнали више о томе како овај програм функционише, посетите Котлин Сецондари Цонструцтор.

Замена функција и својстава чланова

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кључне речи. Ево како:

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

Када покренете програм, излаз ће бити:

 Моје године су 31. Моје лажне године су 26.

Занимљиви Чланци...