数据类
简单点说:使用data class关键字,声明一个数据类,该类会帮你自动重写toString(),equal(),HashCode()方法。
通常来说,数据类的属性都是val的,即不可改变。因为通常创建数据类用于持续化数据维持,或者作为HashMap的一个键使用。而改变数据类的属性都会导致他本身失去意义。因此,kotlin为你提供了一个方法可以copy()本身。同时也可以修改某些属性值。
类委托
使用by关键字。
修饰器模式
这种模式的本质就是创建一个新类,实现与原始类一样的接口并将原来的类的实例作为一个字段保存。与原始类拥有同样行为的方法不用被修改,只需要直接转发到原始类的实例。
简单点说就是给原始类_套了一层壳_,然后所有的接口的法方法直接转交给原始类去完成,只不过可以添加一些自定义的新方法,或者重写一部分的方法。
如果在java中去实现,也没有问题,只是需要重复写很多的模板代码。
而在kotlin中,他通过by关键字实现类委托。
interface Child{
fun walk(){
println("我会走路")
}
}
class Student:Child{
fun call(){
println("我会叫")
}
}
//class Teacher( child: Child = Student()):Child by child
//现场创建一个类继承Child
class Teacher( child: Child = object:Child{}):Child by child
//用一个单例去实现
//当然在正常使用时。这里你可以直接传递一个参数进去,用来使用
fun main() {
Teacher().walk()
}
探究
- 如果这里重写了他的方法,是会将原始类的方法重写,还是只重写当前的类中的方法,于是做以下探究
-
结果为:class Teacher(val child: Child = object:Child{}):Child by child{ override fun walk() { super.walk() println("干嘛") } } //用一个单例去实现 fun main() { Teacher().walk() Teacher().child.walk() }
也就是他并没有重写该类的方法,而是在底层自动将委托类的方法都模板套入了一遍。
本文使用 文章同步助手 同步