Scala學習第十四天 Scala中作為介面的trait、在物件中混入trait程式碼實戰
阿新 • • 發佈:2018-12-25
1、java中有interface介面,scala裡有同樣功能的關鍵字trait,trait的功能比interface功能強大很多。
2、trait和Java中的有所不同 interface中只能定義abstarct public方法 而trait中可以定義具體實現方法
class UserTrait {
}
trait Logger{
def log(msg: String) //在trait中定義抽象方法
def logImpl(msg: String){} //在trait中定義具體方法
}
/**
* 類可以繼承多個trait 語法為:extend trait with trait1
*/
class ConcreteLogger extends Logger with Cloneable{
override def log(msg: String) = println("Log:"+msg) //複寫Logger trait中log抽象方法
def concreteLogger{
log("It's me")
}
}
/**
* 在使用物件混入trait使用的前提是
* 該TraitLogger要繼承複寫方法的那個trait
*/
trait TraitLogger extends Logger {
override def log(msg: String){
println("TraitLogger log content is :" + msg)
}
}
trait TraitLoggered{
def logged(msg: String){
println("TraitLoggered log content is :" + msg)
}
}
/**
* Scala中作為介面的trait、在物件中混入trait
*/
object InterfaceOps {
def main(args: Array[String]): Unit = {
val concreteLogger = new ConcreteLogger
concreteLogger.concreteLogger
//row result : Log:It's me
val concreteLogger1 = new ConcreteLogger
with TraitLogger
//在例項化時混入trait 則會呼叫TraitLogger中的log
concreteLogger1.concreteLogger
//row result : TraitLogger log content is :It's me
}
}
scala和java一樣只能繼承一個類或抽象類,但可以實現多個介面,scala可以在物件中混入多個trait程式碼,把各種各樣工具方法混入類和物件中,這給我們構造大型工廠和複雜一些的上下文環境十分重要。