第27节:Scala面向对象内幕实践解密

来源:互联网 发布:java nio attach 编辑:程序博客网 时间:2024/05/17 02:56


下面解释为什么不需要写main方法直接继承App就可以执行方法:


object AppInternals {

  
}


trait Helper extends DelayedInit {
  def delayeinit(body: => Unit) = {
    println("this is the initialization code of C")
    body //evalutes the initialization code of C
  }
}


class C extends Helper {
  //scala 2.10.x支持这种写法,2.11.x后就不支持了因为C是个abstract类型
   println("this is the initialization code of C")
}


object Test extends App{
  val c =new C
  println("hello spark")

}



 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

 

 

 

 

 


 

 

 

 

 

 

 

 

 


下面写个日志打印的小例子:

package com.dtspark.scala.basics


object Logger {
  
}


trait _Logger{
  def log(msg:String):Unit={
    println("Log:  "+msg)
  }
}


trait RemoteLogger extends _Logger{
  override  def log(msg:String):Unit={
    println("RemoteLogger:  "+msg)
  }
}


trait NullLogger extends _Logger{
  override  def log(msg:String):Unit={ }
}




/*trait Data {
  val logger =new _Logger{}
  def query(input:String):String= {
    logger.log(input)
    "Result"+ input
  }
}*/


trait DataAcess {
  //val logger =new _Logger{}
  def query(input:String):String= {
  //  logger.log(input)
    "Result"+ input
  }
}


/*trait DataAcessWithLogger {
  val logger =new _Logger{}
  val data =new DataAcess{}
   def query(input:String):String= {
     logger.log(input)
     data.query(input)
  }
}*/




/*trait DataAcessWithLogger extends DataAcess with _Logger {
  //val logger =new _Logger{}
 // val data =new DataAcess{}
 override  def query(input:String):String= {
      log(input)
      super.query(input)
  }
}*/


trait _LoggerManger{
  val logger:_Logger =new _Logger{}
}


trait RemoteLoggerManger extends _LoggerManger{
 override val logger:_Logger =new RemoteLogger{}
}


trait NullLoggerManger extends _LoggerManger{
  override val logger:_Logger =new NullLogger{}


}


/*trait DataAcessDAO extends   _Logger {
  //val logger =new _Logger{}
 // val data =new DataAcess{}
   def query(input:String):String= {
      log(input)
      "DataAcessDAO Result"
     // super.query(input)
  }
}*/




trait DataAcessDAO extends   _LoggerManger {//可以通过工厂来实例化
  //val logger =new _Logger{}
 // val data =new DataAcess{}
   def query(input:String):String= {
      logger.log(input)
      "DataAcessDAO Result"
     // super.query(input)
  }
}


object OOPAdvanced {
  def main(args: Array[String]): Unit = {
    
  }
}

 

0 0
原创粉丝点击