scala学习-trait学习

时间:2022-03-20 23:15:20
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方法。