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