Šajā rakstā jūs uzzināsit par Kotlinas konstruktoriem (gan primārajiem, gan sekundārajiem konstruktoriem), kā arī par inicializatoru blokiem, izmantojot piemērus.
Konstruktors ir kodolīgs veids, kā inicializēt klases īpašības.
Tā ir īpaša dalībnieka funkcija, kas tiek izsaukta, kad objekts tiek instantificēts (izveidots). Tomēr tas, kā viņi strādā Kotlinā, ir nedaudz atšķirīgs.
Kotlīnā ir divi konstruktori:
- Primārais konstruktors - kodolīgs klases inicializācijas veids
- Sekundārais konstruktors - ļauj ievietot papildu inicializācijas loģiku
Galvenais konstruktors
Primārais konstruktors ir daļa no klases galvenes. Lūk, piemērs:
klases persona (val firstName: String, var age: Int) (// klases ķermenis)
Koda bloks ieskauj iekavās ir galvenais konstruktors: (val firstName: String, var age: Int)
.
Konstruktors deklarēja divus rekvizītus: firstName
(tikai lasāms rekvizīts, jo tas tiek deklarēts, izmantojot atslēgvārdu val
) un age
(rekvizīts lasīt-rakstīt, jo tas tiek deklarēts ar atslēgvārdu var
).
Piemērs: primārais konstruktors
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) ( )
Palaidot programmu, izeja būs:
Vārds = Džo vecums = 25
Kad Person
klases objekts ir izveidots, "Joe"
un 25
vērtības tiek nodotas tā, it kā Person
tā būtu funkcija.
Tas inicializē firstName
un age
person1 objekta "Joe"
un 25
attiecīgi īpašības.
Ir arī citi primāro konstruktoru izmantošanas veidi.
Primārā konstruktora un inicializatora bloki
Primārajam konstruktoram ir ierobežota sintakse, un tajā nedrīkst būt neviena koda.
Lai ievietotu inicializācijas kodu (ne tikai kodu, lai inicializētu īpašības), tiek izmantots inicializētāja bloks. Tas tiek pievienots ar init
atslēgvārdu. Pārveidosim iepriekš minēto piemēru ar inicializētāja 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") ) )
Palaidot programmu, izeja būs:
First Name = Joe Age = 25
Šeit iekavās esošie parametri fName un personAge pieņem vērtības "Joe"
un 25
attiecīgi, kad tiek izveidots person1 objekts. Tomēr fName un personAge tiek izmantoti, neizmantojot var
vai val
, un tie nav Person
klases īpašības .
Person
Klasē ir divas īpašības FirstName, un paziņoja vecuma.
Kad person1
objekts ir izveidots, tiek izpildīts kods inicializētāja blokā. Inicializētāja bloks ne tikai inicializē tā īpašības, bet arī izdrukā tos.
Šeit ir vēl viens veids, kā veikt to pašu uzdevumu:
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") ) )
Lai nošķirtu konstruktora parametru un īpašību, tiek izmantoti dažādi vārdi (fName and firstName, personAge un age). Konstruktora parametriem biežāk tiek izmantots nosaukums _firstName un _age, nevis pilnīgi atšķirīgs nosaukums. Piemēram:
klases persona (_firstName: virkne, _age: Int) (val firstName = _firstName.capitalize () var age = _age // inicializētāja bloks init (…))
Sākotnējā konstruktora noklusējuma vērtība
Konstruktora parametriem varat norādīt noklusējuma vērtību (līdzīgi kā funkciju noklusējuma argumentu sniegšanai). Piemēram:
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") ) )
Palaidot programmu, izeja būs:
Vārds = Džo Vecums = 25 persona2 tiek saīsināts Vārds = Džeks Vecums = 0 cilvēks3 ir instantificēts Vārds = Nezināms Vecums = 0
Kotlina sekundārais konstruktors
Kotlīnā klasē var būt arī viens vai vairāki sekundārie konstruktori. Tie ir izveidoti, izmantojot constructor
atslēgvārdu.
Sekundārie konstruktori Kotlinā nav tik izplatīti. Visizplatītākais sekundārā konstruktora lietojums parādās, kad jums jāpaplašina klase, kas nodrošina vairākus konstruktorus, kuri inicializē klasi dažādos veidos. Pirms to uzzināt, noteikti pārbaudiet Kotlin mantojumu.
Lūk, kā jūs varat izveidot sekundāro konstruktoru Kotlīnā:
klases žurnāls (konstruktors (dati: virkne) (// daži kods) konstruktors (dati: virkne, numursOfData: Int) (// kāds kods))
Šeit Log
klasei ir divi sekundārie konstruktori, bet nav galvenā konstruktora.
Jūs varat paplašināt klasi kā:
klases žurnāls (konstruktors (dati: virkne) (// kods) konstruktors (dati: virkne, numursOfData: Int) (// kods)) klase AuthLog: žurnāls (konstruktors (dati: virkne): super (dati) (// kods ) konstruktors (dati: virkne, numberOfData: Int): super (dati, numberOfData) (// kods))
Šeit atvasinātās klases AuthLog
konstruktori izsauc atbilstošo bāzes klases konstruktoru Log
. Tam super()
tiek izmantots.
Kotlinā jūs varat arī izsaukt konstruktoru no cita tās pašas klases konstruktora (piemēram, Java), izmantojot this()
.
klase AuthLog: Žurnāls (konstruktors (dati: virkne): šis (dati, 10) (// kods) konstruktors (dati: String, numberOfData: Int): super (dati, numberOfData) (// kods))
Piemērs: Kotlina sekundārais konstruktors
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) ( ) )
Palaidot programmu, izeja būs:
No AuthLog -> nepareiza parole: 10 reizes
Piezīme . Sekundārajam konstruktoram ir jāinicializē bāzes klase vai jāpiešķir citam konstruktoram (piemēram, iepriekš minētajā piemērā), ja klasē nav galvenā konstruktora.