scala特质

package com.ming.test


/**
 * scala 特质,类似与java接口,但是比java接口强大,可以有实现方法,定义字段之类的
 */

/**
 * 定义一个日志的特质
 */
trait LoggerTrait {
  def logger(str:String):String
  def loggerDev(str:String):String={"hello"}
}

/**
 * 定义一个是否相等的特质
 */
trait EqualTrait {
  def isEqual(x: Any): Boolean
  def isNotEqual(x: Any): Boolean = !isEqual(x)
}

/**
 * 定义一个类,继承上面两个特质
 */
class LoggerClass(xc: Int, yc: Int) extends LoggerTrait with EqualTrait{
  var x: Int = xc
  var y: Int = yc
  def isEqual(obj: Any) =
    obj.isInstanceOf[LoggerClass] &&
    obj.asInstanceOf[LoggerClass].x == x
    
  def logger(str:String):String={str}
}

/**
 * 定义一个空类,打算在使用的时候去实现特质
 */
class KongClass{
  
}

object TraitTest{
  def main(args: Array[String]): Unit = {
    
    var a=new LoggerClass(5,6);
    var b=new LoggerClass(5,6);
    var c=new LoggerClass(5,7);
    println(a.isEqual(b));
    println(a.isEqual(c));
    println(a.isNotEqual(c));
    println(a.loggerDev(""));
    
    //空类使用继承不同的特质,类似与java实现接口哦
    var kong1=new KongClass with LoggerTrait{
       def logger(str:String):String={str}
    }
    val str=kong1.logger("kong1")
    println(str)
    
  }
}
特质构造顺序
特质也可以有构造器,由字段的初始化和其他特征体中的语句构成。这些语句在任何混入该特质的对象在构造是都会被执行。
构造器的执行顺序:
调用超类的构造器;
特质构造器在超类构造器之后、类构造器之前执行;
特质由左到右被构造;
每个特质当中,父特质先被构造;
如果多个特质共有一个父特质,父特质不会被重复构造
所有特质被构造完毕,子类被构造。

 

posted @ 2016-11-30 15:52  全力以赴001  阅读(381)  评论(0编辑  收藏  举报