专栏原创出处:github-源笔记文件 (opens new window) ,github-源码 (opens new window),欢迎 Star,转载请附上原文出处链接和本声明。
Scala 编程语言专栏系列笔记,系统性学习可访问个人复盘笔记-技术博客 Scala 编程语言 (opens new window)
# 什么是特质
特质用于在类之间共享程序接口和字段。
- 特质类似于 Java 中的接口。
- 特质中可以声明属性和方法。
- 类和对象可以扩展特质,但是特质不能被实例化,因此特质没有参数。
# 如何定义特质
最简单的定义方法就是关键字 trait + 标识符
。
特质用作泛型类型和定义抽象方法非常有用。
trait HairColor // 定义一个简单的特质
// 定义一个带有泛型类型和抽象方法的特质
trait Iterator[A] {
def hasNext: Boolean
def next(): A
}
# 如何使用特质
- 如果子类没有父类,第一个实现的特质用
extends
关键字,其余实现的特质用with
关键字。 - 如果子类存在父类,则剩余实现的特质都使用
with
关键字。
使用 override 关键字来实现特质里面的任何抽象成员。
trait Iterator[A] {
def hasNext: Boolean
def next(): A
}
// IntIterator 将参数 to 作为 hasNext 方法比较的上限,并扩展了 Iterator 的类型为 Int
// 因此 next 方法必须返回 Int 类型的值
class IntIterator(to: Int) extends Iterator[Int] {
private var current = 0
override def hasNext: Boolean = current < to
override def next(): Int = {
if (hasNext) {
val t = current
current += 1
t
} else 0
}
}
val iterator = new IntIterator(10)
iterator.next() // returns 0
iterator.next() // returns 1
# 子类型(实现类)的作用
凡是需要特质的地方,都可以由该特质的子类型来替换。
trait Pet {
val name: String
}
class Cat(val name: String) extends Pet
class Dog(val name: String) extends Pet
val dog = new Dog("Harry")
val cat = new Cat("Sally")
// 此处集合中需要放入 Pet 类型的对象,因为 Cat 和 Dog 实现了 Pet 特质,因此对象 dog 和 cat 可以放入该集合
val animals = ArrayBuffer.empty[Pet]
animals.append(dog)
animals.append(cat)
animals.foreach(pet => println(pet.name)) // Prints Harry Sally