[[oktatas:programozás:kotlin|< Kotlin]] ====== Kotlin Objektum Orientált Programozás ====== * **Szerző:** Sallai András * Copyright (c) Sallai András, 2020 * Licenc: [[https://creativecommons.org/licenses/by-sa/4.0/|CC Attribution-Share Alike 4.0 International]] * Web: https://szit.hu ===== Osztály ===== class Dolgozo { var nev = "Névtelen" var kor = 0 } class Dolgozo { var nev = "Nagy János" var kor = 35 } fun main() { var janos = Dolgozo() janos.nev = "Nagy János" println(janos.nev) } ===== Konstruktor használata ===== class Dolgozo { var nev: String var kor: Int init { nev = "Névtelen" kor = 0 } } A konstruktor paraméterei: class Dolgozo(atvettNev: String, atvettKor: Int) { var nev: String var kor: Int init { nev = atvettNev kor = atvettKor } } fun main() { var janos = Dolgozo("Nagy János", 25) var lajos = Dolgozo("Pere Lajos", 37) println(janos.nev) println(lajos.nev) } Konstruktor többféle paraméterrel: class Dolgozo(atvettNev: String, atvettKor: Int) { var nev: String var kor: Int init { nev = atvettNev kor = atvettKor } constructor(atvettNev: String) : this(atvettNev, 0) constructor() : this("Névtelen", 0) } fun main() { var jani = Dolgozo("Nagy János", 25) var lali = Dolgozo("Pere Lajos") var feri = Dolgozo() println(jani.nev) println(lali.nev) println(feri.nev) } ===== Setter/Getter ===== class Dolgozo() { var nev = "Névtelen" var kor = 0 set(value) { if(value < 0) throw IllegalArgumentException( "Nem lehet negatív értéket megadni") field = value } get() = field /2 } fun main() { var feri = Dolgozo() feri.kor = 35 println(feri.kor) } A beállító kötelezően a megfelelő mező után kell álljon. Új tulajdonság felvétele a getterrel: class Dolgozo() { var nev = "Névtelen" var kor = 0 set(value) { if(value < 0) throw IllegalArgumentException( "Nem lehet negatív értéket megadni") field = value } get() = field / 2 val korBeallitva get() = kor != 0 } fun main() { var feri = Dolgozo() feri.kor = 35 if(feri.korBeallitva) println("beállítva") else println("Nincs beállítva") } ===== Tagfüggvények ===== class Dolgozo() { var nev = "Névtelen" var kor = 0 fun udvozles() { println("Szia") } } fun main() { var feri = Dolgozo() feri.udvozles() } ===== Előkészítés később ===== Ha egy tulajdonság nem primitív típusú és nem lehet null, akkor használható a lateinit módosító. Ez lehetővé teszi, hogy ne legyen előkészítve egy tulajdonság. class Dolgozo() { lateinit var nev: String var kor = 0 } fun main() { var feri = Dolgozo() println(feri.nev) } ===== Infix függvények ===== class Dolgozo() { var nev = "Névtelen" var kor = 0 infix fun feleseg(hitves: Dolgozo) { println("$nev felesége: ${hitves.nev}") } } fun main() { var feri = Dolgozo() var mari = Dolgozo() feri.nev = "Váltó Ferenc" mari.nev = "Pontos Mária" feri feleseg mari } A feri és mari objektum között a feleseg függvény mintegy infix operátor működik. Az infix függvényekről [[oktatas:programozas:algoritmusok:lengyelforma:#a_lengyelformarol|itt]] olvashatsz. ===== Operátorok ===== A legtöbb operátor előredefiniált névvel rendelkezik, amelyek felhasználhatók osztályok közötti műveletekre. A következő kódban a + operátor számra határozunk meg egy műveletet. class Dolgozo() { var nev = "Névtelen" var kor = 0 operator fun plus(hitves: Dolgozo) { println("$nev felesége: ${hitves.nev}") } } fun main() { var feri = Dolgozo() var mari = Dolgozo() feri.nev = "Váltó Ferenc" mari.nev = "Pontos Mária" feri + mari } A megoldás hasonlít az infix függvényekhez. ===== Enum ===== Ha csak arra van szükség, hogy olyan változónk legyen, amely egyetlen értéket képes felvenni, és ezek az értékek különböznek egymástól, akkor használjuk az enum osztályt. enum class Egtaj { ESZAK, DEL, KELET, NYUGAT, } fun main() { var egtaj = Egtaj.ESZAK println(egtaj) } Szöveg meghatározása: enum class Egtaj(val egtaj: String) { ESZAK("észak"), DEL("dél"), KELET("kelet"), NYUGAT("nyugat"), ; override fun toString(): String { return egtaj } } fun main() { var egtaj = Egtaj.ESZAK println(egtaj) } ===== Kivételkezelés ===== fun osztas(szamlalo : Int, nevezo: Int): Int { try { return szamlalo / nevezo }catch(e: ArithmeticException) { println(e) return 0 } } fun main() { println(osztas(3, 0)) } A futtatás eredménye: java -jar kivetel.jar java.lang.ArithmeticException: / by zero 0 A return a try elé: fun osztas(szamlalo : Int, nevezo: Int): Int { return try { szamlalo / nevezo }catch(e: ArithmeticException) { 0 } } fun main() { println(osztas(3, 0)) } A kivétel kezelése máshol: fun osztas(szamlalo : Int, nevezo: Int): Int { return try { probaOsztas(szamlalo, nevezo) }catch(e: ArithmeticException) { 0 } } fun probaOsztas(szamlalo : Int, nevezo: Int): Int { return szamlalo / nevezo } fun main() { println(osztas(3, 0)) } ===== Öröklés ===== open class Dolgozo { var nev = "Névtelen" var kor = 85 var beosztas = "ismeretlen" } class Mernok : Dolgozo() { var diploma = "AC834" } fun main() { var janos = Mernok() janos.nev = "Nagy János" println(janos.nev) } Metódus felülírása: open class Dolgozo { var nev = "Névtelen" var kor = 85 var beosztas = "ismeretlen" open fun dolgozik() { println("lapátol") } } class Mernok() : Dolgozo() { var diploma = "AC834" override fun dolgozik() { println("számol") } } fun main() { var janos = Mernok() janos.dolgozik() } Egy metódus felülírásához az eredeti osztályban szükséges az **open** módosító. Ha szeretnénk az eredeti osztály metódusát is meghívni: open class Dolgozo { var nev = "Névtelen" var kor = 85 var beosztas = "ismeretlen" open fun dolgozik() { println("lapátol") } } class Mernok() : Dolgozo() { var diploma = "AC834" override fun dolgozik() { println("számol") super.dolgozik() } } fun main() { var janos = Mernok() janos.dolgozik() }