Kotlin之通用对象方法、数据类和委托类

2019-01-16  本文已影响28人  满天星爱我

通用对象方法

声明一个类,用来存储客户名称和邮编

class Client(val name:String,val postalCode:Int)

数据类:自动实现通用方法

如果想要你的类是一个方便的数据容器,你需要重写这些方法: toString、equals和hashCode。而在Kotlin中你不需要再去生成这些方法了,给你的类添加data修饰符,必要的方法将会自动生成

 data class Client(val name:String,val postalCode:Int)

现在就得到了一个重写了所有标准Java方法的类

数据类和不可变性:copy()方法

在数据类中,如果属性使用val,在对象被创建出来时,对象内部的值是无法改变的。为了让不可变数据的数据类可以变得更容易,Kotlin给它们提供了一个方法:一个允许copy类的实例的方法,并在copy的同时修改某些属性的值

下面为手动实现`copy方法

  class Client(val name:String,val postalCode:Int){
  fun copy(name:String = this.name,postalCode: Int = this.postalCode) = Client(name,postalCode)
}

val client = Client("kangdongpu",123456)
println(client.copy("kdp123"))

输出

Client(name=kdp123, postalCode=123456)

委托类:使用by关键字

例如要实现一个如Collection接口的装饰器,那么你需要实现它内部的所有方法,即使你不做任何行为的修改

class DelegatingCollection<T> : Collection<T>{
    override val size: Int
        get() = this.size
    override fun contains(element: T): Boolean = this.contains(element)
    override fun containsAll(elements: Collection<T>): Boolean = this.containsAll(elements)
    override fun isEmpty(): Boolean = this.isEmpty()
    override fun iterator(): Iterator<T> = this.iterator()
}

而现在Kotlin将委托作为一个语言级别的的功能做了头等支持。无论什么时候实现一个接口,你都可以使用by关键字将接口的实现委托到另一个对象

class DelegatingCollection<T> (innerList: Collection<T> = ArrayList<T>()) : Collection<T> by innerList{
}

类中所有的方法实现都消失了,编译期会自动实现它们,并且方法的实现和上面的DelegatingCollection的例子是相似的,而当你需要修改某些方法的行为时,再去重写这些方法

上一篇 下一篇

猜你喜欢

热点阅读