Trait Scala (fonctionnalité)


Scala Trait (fonctionnalité) est équivalent à l'interface de Java. En fait, il est plus puissant que l'interface.

Contrairement aux interfaces, il peut également définir l'implémentation de propriétés et de méthodes.

Généralement, une classe Scala ne peut hériter que d'une seule classe parent, mais s'il s'agit d'un Trait (fonctionnalité), elle peut en hériter de plusieurs. À partir du résultat, un héritage multiple est obtenu.

Le trait (caractéristique) est défini de la même manière qu'une classe, mais le mot-clé qu'il utilise est trait, comme indiqué ci-dessous :

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

Le trait ci-dessus (caractéristique ) se compose de deux Il se compose de deux méthodes : isEqual et isNotEqual. La méthode isEqual ne définit pas l’implémentation de la méthode et isNotEqual définit l’implémentation de la méthode. Les sous-classes héritent de traits pour implémenter des méthodes non implémentées. Donc, en fait, Scala Trait (fonctionnalité) ressemble plus à la classe abstraite de Java.

Ce qui suit montre un exemple complet de la fonctionnalité :

/* 文件名:Test.scala
 * author:php中文网
 * url:www.php.cn
 */
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))
   }
}

Exécutez le code ci-dessus, le résultat de sortie est :

$ scalac Test.scala 
$ scala Test
false
true
true

Ordre de construction de la fonctionnalité

Fonctionnalité également Il peut y avoir des constructeurs, constitués d'une initialisation de champ et d'autres instructions dans le corps du trait. Ces instructions seront exécutées lors de la construction de tout objet mélangé avec ce trait.

Ordre d'exécution des constructeurs :

  • Appeler le constructeur de la super classe

  • Le constructeur caractéristique est construit dans le la super classe est exécutée après le constructeur et avant le constructeur de la classe ;

  • les traits sont construits de gauche à droite

  • Parmi chaque trait, le le trait parent est construit en premier Construction

  • Si plusieurs fonctionnalités partagent un trait parent, le trait parent ne sera pas construit à plusieurs reprises

  • Toutes les fonctionnalités sont construit, et la sous-classe est construite.

L'ordre des constructeurs est l'inverse de la linéarisation de la classe. La linéarisation est une spécification technique qui décrit tous les supertypes d'un type.