06 octombrie 2022

KOTLIN - Clase (ziua 4)

 Interfețe

- public by default

- nu există implements / extends

interface Time {
fun setTime(hrs: Int, mins: Int = 0, secs: Int = 0)
fun setTime(time: String) = setTime(0) // default implementation
}

interface NoTime {
fun setTime(time: String) {}
}

class MyTime : Time, NoTime {
override fun setTime(hrs: Int, mins: Int, secs: Int) {}

override fun setTime(time: String) {
super<Time>.setTime(time)
super<NoTime>.setTime(time)

}
}


Clase

- public, final by default (și metodele sunt final by default)

- dacă vrei să nu fie final - se specifică open

In Java era o practică bună să adaugi final claselor care nu trebuiesc extinse

- suport pt abstract

- clase sigilate (sealed)

- internal: clase vizibile doar în modulul respectiv 

- protected, private; dar nu există package private

open abstract class Person () {
var firstName: String = ""
var lastName: String = ""

open fun getName(): String = "$firstName $lastName" // can be overriden

abstract fun getWork() // can be implemented

fun getVacations() {} // cannot be overriden
}

class Student : Person() {
override fun getName(): String{return ""}
override fun getWork() {
TODO("Not yet implemented")
}
}


Clase sigilate

- ierarhizare, asemănare cu enum

sealed class PersonEvent {
// nested subclasses
class Awake: PersonEvent()
class Asleep: PersonEvent()
class Eating(val food: String): PersonEvent()
}

fun handlePersonEvent(event: PersonEvent) =
when(event) {
is PersonEvent.Awake -> println("Awake")
is PersonEvent.Asleep -> println("Asleep")
is PersonEvent.Eating -> println("Eating ${event.food}")
}


Constructori

open class Person (_fname: String, _lname: String) {
var firstName: String = ""
var lastName: String = ""

init {
this.firstName = _fname
this.lastName = _lname
}

constructor(name: String) : this(name, "")
}


class Student : Person {
var age: Int;
init {
age = 0;
}

constructor(name: String) : super(name)

constructor(first: String, last: String) : super(first, last)

constructor(first: String, last: String, age: Int) : super(first, last) {
this.age = age;
}
}


Data classes

- furnizează metodele toString, equals, hashCode + metoda copy pentru clonare

- sunt clase imutabile

- introdusă prin keywork data class

fun main(args: Array<String>) {
var st1 = Steward(1, "Lina")
var st2 = Steward(1, "Lina")
var st3 = st2.copy(name = "Roberta")
// toate câmpurile la fel mai puțin name

println("Equal? ".plus(st1 == st2)) // true numai dacă există keyword data peste Steward
println(st3) // apelează toString, rezultat citibil față de un Steward@5e2de80c, dacă nu era data
}

data class Steward(val id: Int, val name: String)

Niciun comentariu: