|
特质(trait)
在java中,如果一个类想实现某个接口,则需要用implements,比如 class MyClass implements Comparable<XXX>{@Override public int compareTo(Float o)...}
在scala特质trait中,可以允许有具体实现方法,trait可以extends某个父类,实例化某个类的时候可以临时混入某一个或多个需要的特质trait,混入特质之后的初始
化顺序是怎么样的呢?这些都需要我们搞清楚。
package scala.joe.com
//校验trait
trait Valid {
//"构造方法体"
println("trait Valid constructor running....")
//抽象方法
def getName:String
//校验方法 具体方法
def valid(v:String):Boolean = getName.equals("joeliang")
}
//日志log trait
trait Log {
println("trait Log constructor running...")
}
//签名log
trait SignalLog extends Log { //trait混入另一个trait时也要用继承extends,不能用with
println("trait SignalLog constructor running....")
}
trait NameLog extends Log {
println("trait NameLog constructor running....")
}
//Personx类
class Personx extends Valid with SignalLog with NameLog {
println("Personx constructor running.....")
override def getName: String = this.toString
}
object TestTrait {
def main(args: Array[String]): Unit = {
val p = new Personx
}
}
显示如下:
trait Valid constructor running....
trait Log constructor running...
trait SignalLog constructor running....
trait NameLog constructor running....
Personx constructor running.....
实验结果说明:Personx在实例化构造时,先构造extends Valid(不管Valid是类还是trait,统一都要用extends),然后再是后面的所有trait
在这些traits中,总顺序是从左到右,每个trait在构造的时候先构造其父trait(如果是trait extends的是某个类,则此时是先构造父类)
如果在构造某个trait的时候,发现其父trait或父类已经被构造了,则不会再构造,所有trait都构造完毕之后才构造这个类
|
|