Scala Trait(特征) 相当于 Java 的接口,实际上它比接口还功能强大。
与接口不同的是,它还可以定义属性和方法的实现。
一般情况下Scala的类只能够继承单一父类,但是如果是 Trait(特征) 的话就可以继承多个,从结果来看就是实现了多重继承。
Trait(特征) 定义的方式与类类似,但它使用的关键字是 trait。如下:
trait Equal {
def isEqual(x: Any): Boolean
def isNotEqual(x: Any): Boolean = !isEqual(x)
}
以上Trait(特征)由两个方法组成:isEqual 和 isNotEqual。isEqual 方法没有定义方法的实现,isNotEqual定义了方法的实现。子类继承特征可以实现未被实现的方法。所以其实 Scala Trait(特征)更像 Java 的抽象类。
Trait 的使用场景
- 当做接口
- 带有具体实现的接口
- 带有特质的对象
- 特质从左到右被构造
package DataStructureAndAlgorithm
/**
* Created by Administrator on 2017/12/23.
*/
// 特质 1
// 带有具体实现的接口
trait Logger1{
def log(msg: String): Unit ={
println("log: " + msg)
}
}
class Test1 extends Logger1{
def test: Unit ={
log("xxx_1")
}
}
// 特质 2
// 当作接口
trait Logger2{
def log(msg: String)
}
// 带有具体实现的接口
trait ConsoleLogger2 extends Logger2{
def log(msg: String): Unit ={
println("log: " + msg)
}
}
class Test2 extends ConsoleLogger2{
def test: Unit ={
log("xxx_2")
}
}
// 特质 3
trait ConsoleLogger {
def log(msg: String): Unit ={
println("save money: " + msg)
}
}
trait MessageLogger extends ConsoleLogger{
override def log(msg: String): Unit ={
println("save money to bank: " + msg)
}
}
abstract class Account{
def save
}
// 带有特质的对象
class MyAccount extends Account with ConsoleLogger{
def save(): Unit ={
log("100")
}
}
object Test13ScalaTrait extends App{
val t = new Test1
t.test
val t2 = new Test2
t2.test
// 带有特质的对象(一个类可以通过 with 扩展多个特质,特质是从左到右被构造)
val m = new MyAccount with MessageLogger
m.save
}
运行结果:
log: xxx_1
log: xxx_2
save money to bank: 100
Process finished with exit code 0