trait是scala中代码复用的基础单元。特质中封装了一些方法和字段,可以通过混入到类中来重用他们。
定义trait的方法:
trait ConsoleLogger{
def logger(msg: String) = {println(msg)}
}
与类的继承不同,一个子类只能继承自唯一的超类,而一个类中可以混入多个特质。特质的定义与类定义除关键字不同以外,基本无大的差异。
特质同样也是类型,但是特质与类又有区别:
1.不可以带有任何“类”参数,即传递给类的主构造器任何参数。
2.在类中,super的调用是静态绑定的,而trait中调用super是动态绑定的。
比如说,先定义一个抽象类:
abstract class IntQueue {
def get(): Int
def put(x: Int)
}
再定义一个类继承自IntQueue类,实现了该抽象类中的抽象方法get和put,且创建了一个私有字段buf。
class BasicIntQueue extends IntQueue{
private val buf = new ArrayBuffer[Int]
def get() = buf.remove(0)
def put(x: Int) { buf += x}
}
定义一个trait,继承自IntQueue,并复写了超类中的put方法
trait Doubling extends IntQueue {
abstract override def put(x: Int) { super.put(x * 2)}
}
在上述的trait中调用的super是动态绑定的。当你定义下面类时
class MyQueue extends BasicIntQueue with Doubling
此时混入Doubling这个特质后,此时的super绑定的BasicIntQueue的put方法。