English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Trait(Feature) Scala

Scala Trait(特征) 相当于 Java 的接口,实际上它比接口还功能强大。

与接口不同的是,它还可以定义属性和方法的实现。

一般情况下Scala的类只能够继承单一父类,但是如果是 Trait(特征) 的话就可以继承多个,从结果来看就是实现了多重继承。

Trait(特征) 定义的方式与类类似,但它使用的关键字是 trait,如下所示:

trait Equal {
  def isEqual(x: Any): Boolean
  def isNotEqual(x: Any): Boolean = !isEqual(x)
}

以上Trait(特征)由两个方法组成:isEqualisNotEqual。isEqual 方法没有定义方法的实现,isNotEqual定义了方法的实现。子类继承特征可以实现未被实现的方法。所以其实 Scala Trait(特征)更像 Java 的抽象类。

以下演示了特征的完整示例:

/* 文件名:Test.scala
 * author:基础教程网
 * url:pt.oldtoolbag.com
 */
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 == x
}
object Test {
   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))
   }
}

Executando o código acima, o resultado de saída é:

$ scalac Test.scala 
$ scala Test
false
true
true

Ordem de Construção de Traits

Os traits também podem ter construtores, compostos por inicialização de campos e语句 em outros corpos de traits. Essas语句 são executadas durante a construção de qualquer objeto que mistura o trait.

A ordem de execução dos construtores:

  • Chama o construtor da super classe;

  • Os construtores de traits são executados após os construtores de super classes e antes dos construtores de classes;

  • Os traits são construídos da esquerda para a direita;

  • Em cada trait, o super trait é construído primeiro;

  • Se vários traits compartilham um super trait, o super trait não será construído repetidamente.

  • Todos os traits são construídos, e as subclasses são construídas.

A ordem dos construtores é o inverso da linearização da classe. A linearização é uma especificação técnica que descreve todos os super tipos de um tipo.