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代码,把各种各样工具方法混入类和对象中,这给我们构造大型工厂和复杂一些的上下文环境十分重要。