Scala trait(接口)

2019-05-12 21:15:34 | 编辑

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
  }
}