下面解释为什么不需要写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 = {
}
}