Scala 使用trait 来替代接口。scala 中的Trait和Java中的接口(interface)极其类似,但又与java的接口有些许不同,甚至Scala Trait 比 java interface 接口更强大.
在java 8之前接口的字类都需要去实现接口的抽象方法,Java 8 做出了改变。现在我们可以在接口中定义方法,这些方法被称为defender 方法或默认方法。实现类仍可以提供自己的实现。如果实现类未提供自己的实现的话,defender 方法会被调用。因此,Java 8 中的接口行为更接近于Scala 中的trait。
但是,Java 8 中的接口与Scala 中的trait 仍有不同之处。Java 8 中的接口只能定义静态字段,而Scala 中的trait 则可以定义实例级字段。这意味着Java 8 中的接口无法管理实例状态。接口实现类必须提供字段以记录状态。这也意味着defender 方法无法访问接口实现体的状态信息,从而限制了defender 方法的用途。
无论是继承类还是trait 接口,都是使用extends关键字。
1. 将trait作为接口使用
trait SayHello { def sayHello (name:String) }
trait MakeFriends { def mkFriends (p:Person) }
class Person(var name:String) extends SayHello with MakeFriends { def sayHello (otherName:String) = println("hello , "+otherName) override def mkFriends(p: Person): Unit = { println("hello (MakeFriends) : "+p.name +", i am " +name) } }
上述完成的基本的接口定义 注意在class 中继承多个trait 第一个使用 extends 后面跟着with
2.在trait 中定义具体的方法与字段 以及抽象字段
trait Logger { // val name :String = "" var age: Int def erro(msg:String) def info(msg: String) { println("Logger : ===> " + msg) } }
class Person(name: String) extends Logger { def sayHello() = { println("Person say: " + name) info(name) } var age: Int = 23 override def erro(msg: String): Unit = { ///xxxxxx } }