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

Trait (característica) de 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:es.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))
   }
}

Ejecutar el código anterior, el resultado de salida será:

$ scalac Test.scala 
$ scala Test
false
true
true

Orden de construcción de características

Las características también pueden tener constructores, compuestos por la inicialización de campos y otras características del cuerpo. Estas instrucciones se ejecutarán en el momento de la construcción de cualquier objeto que mezcle esta característica.

El orden de ejecución de los constructores:

  • Llamar al constructor de la superclase;

  • Los constructores de características se ejecutan después de los constructores de superclases y antes de los constructores de clase;

  • Las características se construyen de izquierda a derecha;

  • En cada característica, primero se construye la supercaracterística;

  • Si múltiples características comparten una supercaracterística, esta no se construirá repetidamente.

  • Todas las características están construidas, las subclases están construidas.

El orden de los constructores es el inverso de la linearización de la clase. La linearización es una especificación técnica que describe todas las superclases de un tipo.