trait在Scala中被用来在类之间共享接口以及字段(field)。trait与Java8中的接口是类似的。class 以及object都可以继承一个trait,但是trait本身不可以进行实例化,因此也就没有参数定义一个trait
一个最小的trait通过一个简单的关键字trait以及一个签名完成trait HariColor
trait作为泛型类以及抽象方法是特别有用的。
trait Iterator[A] {
def hasNext: Boolean
def next(): A
}
继承trait Iteartor[A]需要类型A以及对方法hasNext和next的实现。可以看到hasNext是一个method,只返回一个boolean值;next也是一个方法,返回一个类型为A的值,两个方法都不接受参数,但是next后面有一个(),hasNext后面没有,其实有没有都可以。使用trait
使用extend关键字去继承一个trait,然后实现每一个抽象方法,需要使用override关键字明确指出。
可以看到IntIterator实现了一个迭代器。IntIterator接收一个参数to表示迭代器的边界。IntIterator继承了Iterator[Int],并且实现了next以及hasNext两个方法。Subtyping
可以看到animals是一个Pet类型的数组,Cat以及Dog都是Pet的子类化,这与Java中的接口使用类似。在trait Pet中,含有一个抽象的字段name, 子类化Cat和Dog都实现了这个抽象字段。最后我们调用pet.name其实就相当于Java里面的多态的使用。
留言与评论(共有 0 条评论) |