English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Scala Trait(特征) 相当于 Java 的接口,实际上它比接口还功能强大。
与接口不同的是,它还可以定义属性和方法的实现。
一般情况下Scala的类只能够继承单一父类,但是如果是 Trait(特征) 的话就可以继承多个,从结果来看就是实现了多重继承。
Trait(特征) 定义的方式与类类似,但它使用的关键字是 trait,如下所示:
trait Equal { def isEqual(x: Any): Boolean def isNotEqual(x: Any): Boolean = !isEqual(x) }
以上Trait(特征)由两个方法组成:isEqual 和 isNotEqual。isEqual 方法没有定义方法的实现,isNotEqual定义了方法的实现。子类继承特征可以实现未被实现的方法。所以其实 Scala Trait(特征)更像 Java 的抽象类。
以下演示了特征的完整示例:
/* 文件名:Test.scala * author:基础教程网 * url:fr.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)) } }
En exécutant le code ci-dessus, le résultat est :
$ scalac Test.scala $ scala Test false true true
Les caractéristiques peuvent également avoir des constructeurs, constitués d'initialisation de champs et d'instructions dans d'autres caractéristiques. Ces instructions sont exécutées lors de la construction de tout objet qui mixe cette caractéristique.
L'ordre d'exécution des constructeurs :
Appel du constructeur de la superclasse;
Les constructeurs de caractéristiques s'exécutent après les constructeurs de superclasses et avant les constructeurs de classes;
Les caractéristiques sont construites de gauche à droite;
Dans chaque caractéristique, la supercaractéristique est construite d'abord;
Si plusieurs caractéristiques partagent une supercaractéristique, la supercaractéristique ne sera pas reconstruite.
Toutes les caractéristiques sont construites, les sous-classes sont construites.
L'ordre de construction des constructeurs est le contraire de la linéarisation de la classe. La linéarisation est une spécification technique qui décrit toutes les superclasses d'un type.