Traits封装了方法和字段定义,然后可以通过混合到类中来重用它们。与类继承不同,一个类可以混合任意数量的traits。
traits定义看起来类似于类定义,只是它使用关键字 trait 。以下是trait的基本示例语法。
Traits - 语法
trait Equal { def isEqual(x: Any): Boolean def isNotEqual(x: Any): Boolean=!isEqual(x) }
此traits包含两个方法 isEqual 和 isNotEqual 。在这里,我们没有给出isEqual的任何实现,而另一种方法已经实现了。子类可以为未实现的方法提供实现。因此, traits与Java中的抽象类非常相似。
在这里,需要知道两种重要的Scala方法,在以下示例中将使用它们。
obj.isInstanceOf [Point] 要检查obj和Point的类型是否相同。
obj.asInstanceOf [Point] 表示通过采用对象obj类型进行精确转换,并返回与Point类型相同的obj。
Traits - 示例
trait Equal { def isEqual(x: Any): Boolean def isNotEqual(x: Any): Boolean=!isEqual(x) } class Point(xc: Int, yc: Int) extends Equal { var x: Int=xc var y: Int=yc def isEqual(obj: Any)=obj.isInstanceOf[Point] && obj.asInstanceOf[Point].x == y } object Demo { def main(args: Array[String]) { val p1=new Point(2, 3) val p2=new Point(2, 4) val p3=new Point(3, 3) println(p1.isNotEqual(p2)) println(p1.isNotEqual(p3)) println(p1.isNotEqual(2)) } }
将上述程序保存在 Demo.scala 中。以下命令用于编译和执行该程序。
\>scalac Demo.scala \>scala Demo
true false true
Traits - 值类
Value classes是Scala中避免分配运行时对象的新机制,它包含一个仅带有一个 val 参数的主构造函数,它仅包含不允许使用var,val,嵌套类(nested classes), traits或Object的方法(def),值类不能由其他类扩展,这可以通过使用AnyVal扩展值类来实现。
Traits - 值类示例
trait Printable extends Any { def print(): Unit=println(this) } class Wrapper(val underlying: Int) extends AnyVal with Printable object Demo { def main(args: Array[String]) { val w=new Wrapper(3) w.print() //实际上需要实例化一个 Wrapper 实例 } }
将上述程序保存在 Demo.scala 中。以下命令用于编译和执行该程序。
\>scalac Demo.scala \>scala Demo
它将为您提供Wrapper类的hashCode。
Wrapper@13
参考链接
https://www.learnfk.com/scala/scala-traits.html
标签:obj,Point,Demo,Scala,无涯,Traits,isEqual,scala,def From: https://blog.51cto.com/u_14033984/9430171