本节练习Kotlin
中各种接口的使用
25. n25Comparison
为Mydate
类实现Comparable
接口,式其可以通过我们在Comparable
接口中定义的规则直接比较
data class MyDate(val year: Int, val month: Int, val dayOfMonth: Int) : Comparable<MyDate> {
override fun compareTo(other: MyDate): Int = when {
year != other.year -> year - other.year
month != other.month -> month - other.month
else -> dayOfMonth - other.dayOfMonth
}
}复制代码
26. n26InRange
为DateRange
类实现方法,判断某个Mydate
对象是否在DateRange
的范围中
class DateRange(val start: MyDate, val endInclusive: MyDate){
operator fun contains(item:MyDate):Boolean = start<=item&&item<=endInclusive
}复制代码
也可以
class DateRange(override val start: MyDate, override val endInclusive: MyDate) : ClosedRange<MyDate> {
override fun contains(item: MyDate): Boolean = start <= item && item <= endInclusive
}复制代码
参数前添加了override
是因为CloseRange
接口中也定义了这两个属性,所以我们实现该接口也就复写了这两个参数
27. n27RangeTo
实现rangeTo
接口,该接口的功能是返回一个从当前对象到目标对象的一个集合
operator fun MyDate.rangeTo(other: MyDate): DateRange =DateRange(this,other)复制代码
28. n28ForLoop
为DateRange
实现Iterable
接口
可以专门创建一个类,也可以用对象表达式
class DateRange(override val start: MyDate, override val endInclusive: MyDate) : ClosedRange<MyDate>, Iterable<MyDate> {
override fun iterator(): Iterator<MyDate> = object : Iterator<MyDate> {
var current: MyDate = start
override fun next(): MyDate {
val result = current
current = current.nextDay()
return result
}
override fun hasNext(): Boolean = current <= endInclusive
}
override fun contains(item: MyDate): Boolean = start <= item && item <= endInclusive
}复制代码
class DateRange(override val start: MyDate, override val endInclusive: MyDate) : ClosedRange<MyDate>, Iterable<MyDate> {
override fun iterator(): Iterator<MyDate> =DateIterator(this)
override fun contains(item: MyDate): Boolean = start <= item && item <= endInclusive
}
class DateIterator(val dateRange:DateRange) : Iterator<MyDate> {
var current: MyDate = dateRange.start
override fun next(): MyDate {
val result = current
current = current.nextDay()
return result
}
override fun hasNext(): Boolean = current <= dateRange.endInclusive
}复制代码
29. n29OperatorsOverloading
重载操作符,仅+
operator fun MyDate.plus(timeInterval: TimeInterval) = addTimeIntervals(timeInterval,1)复制代码
为TimeInterval
重载*
,调用时一定要TimeInterval
在前
class RepeatedTimeInterval(val ti: TimeInterval, val n: Int=1)
operator fun TimeInterval.times(number:Int) = RepeatedTimeInterval(this,number)
operator fun MyDate.plus(timeInterval: RepeatedTimeInterval) = addTimeIntervals(timeInterval.ti,timeInterval.n)复制代码
30. n30DestructuringDeclarations
用解构声明解构对象
class MyDate(val year: Int, val month: Int, val dayOfMonth: Int) {
operator fun component1(): Int =year
operator fun component2(): Int =month
operator fun component3(): Int =dayOfMonth
}复制代码
31. n31Invoke
统计调用次数,这里使用了闭包
class Invokable{
var numberOfInvocations: Int = 0
private set
operator fun invoke():Invokable {
numberOfInvocations++
return this
}
}复制代码