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:
Trimiteți un comentariu