Scala中的特征类似于Java中的接口。一个trait可以有字段和方法作为成员,创建trait时这些成员可以是抽象的和非抽象的。
Scala特质的实现可以在Scala类或对象中实现特征。
Scala特质的一些特征:
成员可以是抽象成员,也可以是具体成员。
一个特质可以被另一个特质扩展。
使用“ trait”关键字制成。
语法:
trait trait_name{ def method() }
显示特质使用的示例
此示例取自https://docs.scala-lang.org/tour/traits.html
trait Iterator[A] { def hasNext: Boolean def next(): A } class IntIterator(to: Int) extends Iterator[Int] { private var current = 0 override def hasNext: Boolean = current < to override def next(): Int = { if (hasNext) { val t = current current += 1 t } else 0 } } val iterator = new IntIterator(10) iterator.next() // 返回0 iterator.next() // 返回1
这个例子展示了特质的使用以及它是如何被继承的?该代码创建一个特质名称Iterator,此特质有2个抽象方法hasNext和next。这两种方法都在定义逻辑的IntInterator类中定义。然后为该类创建对象以使用trait函数。
另一个工作示例
trait hello{ def greeting(); } class Ihelp extends hello { def greeting() { println("Hello! This is include Help! "); } } object MyClass { def main(args: Array[String]) { var v1 = new Ihelp(); v1.greeting } }
输出结果
Hello! This is include Help!
该代码显示“您好!这包括帮助!”。使用特征函数重新定义,然后调用该函数。
关于使用特质的一些利弊
特质是Scala中的一个新概念,因此用途有限且互操作性较低。因此,对于可与Java代码一起使用的Scala代码,不应使用特征。抽象类将是一个更好的选择。
Traits可以在多个类中使用时使用,也可以在其他类中使用Traits。
如果一个成员仅使用一次,则应使用具体的类而不是Traits,这将提高代码的效率并使其更可靠。