„Kotlin“ konstruktoriai ir iniciatoriai (su pavyzdžiais)

Šiame straipsnyje naudodamiesi pavyzdžiais sužinosite apie konstruktorius Kotlin (tiek pirminius, tiek antrinius konstruktorius), taip pat inicializatorių blokus.

Konstruktorius yra glaustas būdas inicijuoti klasės savybes.

Tai yra speciali nario funkcija, kuri iškviečiama, kai objektas yra momentinis (sukurtas). Tačiau tai, kaip jie dirba Kotline, šiek tiek skiriasi.

Kotline yra du konstruktoriai:

  • Pirminis konstruktorius - glaustas būdas inicijuoti klasę
  • Antrinis konstruktorius - leidžia įdėti papildomą inicializavimo logiką

Pirminis konstruktorius

Pagrindinis konstruktorius yra klasės antraštės dalis. Štai pavyzdys:

 klasės asmuo (val firstName: String, var age: Int) (// klasės kūnas)

Iš kodas blokas apsuptas skliausteliuose yra pagrindinis konstruktorius: (val firstName: String, var age: Int).

Konstruktorius deklaravo dvi savybes: firstName(tik skaitymo ypatybė, nes ji deklaruojama naudojant raktinį žodį val) ir age(skaitymo ir rašymo ypatybė, kaip deklaruojama su raktiniu žodžiu var).

Pavyzdys: pagrindinis konstruktorius

 fun main(args: Array) ( val person1 = Person("Joe", 25) println("First Name = $(person1.firstName)") println("Age = $(person1.age)") ) class Person(val firstName: String, var age: Int) ( )

Kai paleisite programą, išvestis bus:

 Vardas = Joe amžius = 25

Kai Personsukuriamas klasės objektas , "Joe"o 25vertės perduodamos tarsi Personfunkcija.

Šis inicijuoja firstNameir agesavybės PERSON1 pareikšti prieštaravimus "Joe"ir 25atitinkamai.

Yra ir kitų pirminių konstruktorių panaudojimo būdų.

Pirminio konstruktoriaus ir iniciatoriaus blokai

Pirminio konstruktoriaus sintaksė yra ribota ir jame negali būti jokio kodo.

Norint įdėti inicijavimo kodą (ne tik kodą savybėms inicializuoti), naudojamas inicializatoriaus blokas. Tai priešdėlis su initraktiniu žodžiu. Pakeiskime pirmiau pateiktą pavyzdį su iniciatoriaus bloku:

 fun main(args: Array) ( val person1 = Person("joe", 25) ) class Person(fName: String, personAge: Int) ( val firstName: String var age: Int // initializer block init ( firstName = fName.capitalize() age = personAge println("First Name = $firstName") println("Age = $age") ) )

Kai paleisite programą, išvestis bus:

 First Name = Joe Age = 25

Čia skliaustuose esantys parametrai „fName“ ir „personAge“ priima reikšmes "Joe"ir, 25kai sukuriamas objektas „ person1“ . Tačiau „fName“ ir „personAge“ yra naudojami nenaudojant vararba valir nėra Personklasės ypatybės .

PersonKlasė turi dvi savybes Vardas ir amžius yra deklaruojamos.

Sukūrus person1objektą, vykdomas inicializatoriaus bloko kodas. Iniciatyvos blokas ne tik inicializuoja jo savybes, bet ir jas atsispausdina.

Štai dar vienas būdas atlikti tą pačią užduotį:

 fun main(args: Array) ( val person1 = Person("joe", 25) ) class Person(fName: String, personAge: Int) ( val firstName = fName.capitalize() var age = personAge // initializer block init ( println("First Name = $firstName") println("Age = $age") ) )

Norint atskirti konstruktoriaus parametrą ir ypatybę, naudojami skirtingi pavadinimai (fName ir firstName, ir personAge ir age). Dažniau konstruktoriaus parametrams vietoj visiškai kito pavadinimo naudoti _firstName ir _age. Pavyzdžiui:

 class Person (_firstName: String, _age: Int) (val firstName = _firstName.capitalize () var age = _age // inicializatoriaus blokas init (…)) 

Numatytoji pirminio konstruktoriaus vertė

Galite pateikti numatytąją konstruktoriaus parametrų vertę (panašią į numatytųjų funkcijų argumentų pateikimą). Pavyzdžiui:

 fun main(args: Array) ( println("person1 is instantiated") val person1 = Person("joe", 25) println("person2 is instantiated") val person2 = Person("Jack") println("person3 is instantiated") val person3 = Person() ) class Person(_firstName: String = "UNKNOWN", _age: Int = 0) ( val firstName = _firstName.capitalize() var age = _age // initializer block init ( println("First Name = $firstName") println("Age = $age") ) )

Kai paleisite programą, išvestis bus:

 Vardas = Joe amžius = 25 asmuo2 yra sutrumpintas

Kotlino antrinis konstruktorius

Kotline klasėje taip pat gali būti vienas ar keli antriniai konstruktoriai. Jie yra sukurti naudojant constructorraktinį žodį.

Antriniai konstruktoriai nėra tokie dažni Kotlinas. Dažniausiai antrinis konstruktorius naudojamas tada, kai reikia išplėsti klasę, kurioje yra keli konstruktoriai, kurie inicijuoja klasę skirtingais būdais. Prieš išmokdami, būtinai patikrinkite „Kotlin“ paveldėjimą.

Štai kaip galite sukurti antrinį konstruktorių „Kotlin“:

 klasės žurnalas (konstruktorius (duomenys: eilutė) (// tam tikras kodas) konstruktorius (duomenys: eilutė, numerisOfData: Int) (// tam tikras kodas))

Čia Logklasėje yra du antriniai konstruktoriai, bet nėra pirminio konstruktoriaus.

Galite pratęsti klasę taip:

 klasės žurnalas (konstruktorius (duomenys: eilutė) (// kodas) konstruktorius (duomenys: eilutė, numerisOfData: Int) (// kodas)) klasė AuthLog: žurnalas (konstruktorius (duomenys: eilutė): super (duomenys) (// kodas ) konstruktorius (duomenys: eilutė, numberOfData: Int): super (duomenys, numberOfData) (// kodas))

Čia išvestinės klasės AuthLogkonstruktoriai vadina atitinkamą pagrindinės klasės konstruktorių Log. Tam super()naudojamas.

Kotline taip pat galite paskambinti konstruktoriumi iš kito tos pačios klasės konstruktoriaus (pvz., „Java“) naudodami this().

 klasės „AuthLog“: „Log“ (konstruktorius (duomenys: eilutė): tai (duomenys, 10) (// kodas) konstruktorius (duomenys: eilutė, numerisOfData: Int): super (duomenys, skaičiusOfData) (// kodas)) 

Pavyzdys: „Kotlin“ antrinis konstruktorius

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

Kai paleisite programą, išvestis bus:

 Iš „AuthLog“ -> Blogas slaptažodis: 10 kartų

Pastaba: Antrinis konstruktorius turi inicijuoti pagrindinę klasę arba perduoti kitam konstruktoriui (kaip parodyta aukščiau pateiktame pavyzdyje), jei klasėje nėra pirminio konstruktoriaus.

Įdomios straipsniai...