Scala 特质(Traits )

Scala Trait 特质

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,这将提高代码的效率并使其更可靠。