// Класс данных, компилятором определяются toString, copy
data class Person(val name: String, var age: Int=0)
val person1 = Person("John",10)
println(person1) // Person(name=John, age=10)
val person2 = Person("Alex")
println(person2.name)
person2.age=20
println(person2)
// Класс данных с методами
data class Point(var x:Double=0.0, var y:Double=0.0) {
fun distanceTo(p:Point):Double = hypot(x-p.x,y-p.y)
}
val p1=Point(0.5,0.7)
println(p1)
var p2=p1.copy(y=2.3)
p2.x+=1.0
println(p2)
println(p1.distanceTo(p2))
// Point как обычный класс, необходимо определять toString, copy
class Point(var x:Double=0.0, var y:Double=0.0) {
override fun toString(): String = "($x, $y)"
fun copy(x:Double = this.x, y: Double = this.y) = Point(x, y)
fun distanceTo(p:Point):Double = hypot(x-p.x,y-p.y)
}
val p1=Point(0.5,0.7)
println(p1)
var p2=p1.copy(y=2.3)
p2.x+=1.0
println(p2) // (1.5,2.3)
println(p1.distanceTo(p2))
// Шаблонный класс Stack
class Stack<T> {
val elements:MutableList<T> = mutableListOf()
fun isEmpty()=elements.size==0
fun pop():Unit {
if(!isEmpty()) elements.removeAt(elements.size-1)
}
fun push(x:T):Unit {
elements.add(x)
}
fun top()=elements.last()
}
var s=Stack<Int>()
s.push(10)
s.push(20)
println(s.top())
s.pop()
println(s.top())
```