scala学习四 scala中的特质

来源:互联网 发布:jsp页面显示数据库 编辑:程序博客网 时间:2024/06/02 22:04

Scala 使您能够定义处于接口和类之间的新型结构,称为特征(trait。特征很奇特,因为一个类可以按照需要整合许多特征,这与接口相似,但它们还可包含行为,这又与类相似。

特质可以理解为继承的一种局部体现

(1)创建一个person POJO(第一种实现)

//This is Scalaclass Person(var firstName:String, var lastName:String, var age:Int){}
(2)创建一个监听器

//This is Scalaobject PCL    extends java.beans.PropertyChangeListener{    override def propertyChange(pce:java.beans.PropertyChangeEvent):Unit =    {        System.out.println("Bean changed its " + pce.getPropertyName() +            " from " + pce.getOldValue() +            " to " + pce.getNewValue())    }}object App{    def main(args:Array[String]):Unit =    {        val p = new Person("Jennifer", "Aloi", 28)       <span style="background-color: rgb(192, 192, 192);"> p.addPropertyChangeListener(PCL)</span>                p.setFirstName("Jenni")        p.setAge(29)                System.out.println(p)    }}
创建对监听的支持方法:

//This is Scala<span style="background-color: rgb(192, 192, 192);">trait BoundPropertyBean</span>{    import java.beans._    val pcs = new PropertyChangeSupport(this)        def addPropertyChangeListener(pcl : PropertyChangeListener) =        pcs.addPropertyChangeListener(pcl)        def removePropertyChangeListener(pcl : PropertyChangeListener) =        pcs.removePropertyChangeListener(pcl)        def firePropertyChange(name : String, oldVal : _, newVal : _) : Unit =        pcs.firePropertyChange(new PropertyChangeEvent(this, name, oldVal, newVal))}
person的第二种实现:

//This is Scalaclass Person(var firstName:String, var lastName:String, var age:Int)    extends Object   <span style="background-color: rgb(192, 192, 192);"> with BoundPropertyBean   这就实现了代码的植入(其实我感觉这个原理很想动态代理)</span>{    override def toString = "[Person: firstName=" + firstName +        " lastName=" + lastName + " age=" + age + "]"}
person的第三种实现当属性改变是触发监听事件

//This is Scalaclass Person(var firstName:String, var lastName:String, var age:Int)    extends Object    with BoundPropertyBean{    def setFirstName(newvalue:String) =    {        val oldvalue = firstName        firstName = newvalue        firePropertyChange("firstName", oldvalue, newvalue)    }    def setLastName(newvalue:String) =    {        val oldvalue = lastName        lastName = newvalue        firePropertyChange("lastName", oldvalue, newvalue)    }    def setAge(newvalue:Int) =    {        val oldvalue = age        age = newvalue        firePropertyChange("age", oldvalue, newvalue)    }    override def toString = "[Person: firstName=" + firstName +        " lastName=" + lastName + " age=" + age + "]"}
主方法的实现:

<pre class="displaycode" style="margin-top: 0px; border: 1px solid rgb(204, 204, 204); outline: 0px; font-size: 11px; vertical-align: baseline; width: 780px; font-family: 'Andale Mono', 'Lucida Console', Monaco, Liberation, fixed, monospace; overflow: auto; clear: right; margin-bottom: 6px !important; padding: 5px 10px 5px 3px !important; background-color: rgb(247, 247, 247) !important;">args:Array[String]
)//This is Scalaobject App extends Application Application这个特质可以代替main方法{//def main (args:Array[String]){ //也可以这样写 大家可以看下Application的源码 val p = new Person("Jennifer", "Aloi", 29) p.addPropertyChangeListener(PCL) p.setFirstName("Jenni") p.setAge(30) System.out.println(p)// }}


下面再来看看特征与集合的关系:

在 Scala 文档集中,经典的示例就是 Ordered 特征,它定义了名字很有趣的方法,以提供比较(以及排序)功能:

//This is Scalatrait Ordered[A] {  def compare(that: A): Int    def <  (that: A): Boolean = (this compare that) <  0  def >  (that: A): Boolean = (this compare that) >  0  def <= (that: A): Boolean = (this compare that) <= 0  def >= (that: A): Boolean = (this compare that) >= 0  def compareTo(that: A): Int = compare(that)}

scala中特质与Java中接口的兼容性    (在scala中特质是Java中接口的代替,在编译成字节码是,特质表示的还是接口)

(1)创建一个代表学生的特质:

//This is Scalatrait Student{    def getFirstName : String;    def getLastName : String;    def setFirstName(fn : String) : Unit;    def setLastName(fn : String) : Unit;    def teach(subject : String)}
使用javap命令查看:(虽然有的时候特质全是实现方法,但也不可以实例化,在jvm中特质就是接口)

$ javap StudentCompiled from "Student.scala"public <span style="background-color: rgb(192, 192, 192);">interface</span> Student extends scala.ScalaObject{    public abstract void setLastName(java.lang.String);    public abstract void setFirstName(java.lang.String);    public abstract java.lang.String getLastName();    public abstract java.lang.String getFirstName();    public abstract void teach(java.lang.String);}
构建一个创建student的工厂方法:

//This is Javaobject StudentFactory{    class StudentImpl(var first:String, var last:String, var subject:String)        extends Student    {        def getFirstName : String = first        def setFirstName(fn: String) : Unit = first = fn        def getLastName : String = last        def setLastName(ln: String) : Unit = last = ln                def teach(subject : String) =            System.out.println("I know " + subject)    }    def getStudent(firstName: String, lastName: String) : Student =    {        new StudentImpl(firstName, lastName, "Scala")    }}
在Java中调用:

//This is Javapublic class App{    public static void main(String[] args)    {        Student s = StudentFactory.getStudent("Neo", "Anderson");        s.teach("Kung fu");    }}





0 0
原创粉丝点击