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
- scala学习四 scala中的特质
- Scala中的特质详解
- Scala学习笔记--特质
- scala学习笔记-特质
- Scala学习笔记(3)-Scala特质
- scala 特质
- Scala 特质
- Scala特质
- Scala--特质
- scala-特质
- Scala学习笔记(八) - 特质
- Scala学习笔记05--特质
- Scala学习笔记05--特质
- Scala学习笔记(八) - 特质
- Scala学习笔记(八) - 特质
- scala学习之特质(trait)
- Scala学习第十章 特质
- Scala学习笔记5 - 特质
- 剖析RedHat Linux中三个重要内核文件
- 工业超纯水机:超纯水机应用特点及选型的条件选择详情
- Android提高第三篇之SurfaceView与多线程的混搭
- 八月第一天
- 文档格式批量转换(doc,txt,pdf等)
- scala学习四 scala中的特质
- GCC头文件及库文件路径的配置
- HDU 1254——推箱子
- Java 查看java字节码(有图)
- MATLAB支持的几种图像文件格式
- Find them, Catch them
- 字典树
- HDU1042 高精度阶乘
- Unix中init的工作__处女篇博客