Quels sont les avantages d’utiliser des traits plutôt que des classes abstraites?

Quelqu’un peut-il s’il vous plaît expliquer les traits de Scala? Quels sont les avantages des traits par rapport à l’extension d’une classe abstraite?

La réponse courte est que vous pouvez utiliser des traits multiples – ils sont “empilables”. De plus, les traits ne peuvent pas avoir de parameters de constructeur.

Voici comment les traits sont empilés. Notez que l’ordre des traits est important. Ils s’appelleront de droite à gauche.

class Ball { def properties(): List[Ssortingng] = List() override def toSsortingng() = "It's a" + properties.mkSsortingng(" ", ", ", " ") + "ball" } trait Red extends Ball { override def properties() = super.properties ::: List("red") } trait Shiny extends Ball { override def properties() = super.properties ::: List("shiny") } object Balls { def main(args: Array[Ssortingng]) { val myBall = new Ball with Shiny with Red println(myBall) // It's a shiny, red ball } } 

Ce site donne un bon exemple d’utilisation des traits. Un grand avantage des traits est que vous pouvez étendre plusieurs traits, mais seulement une classe abstraite. Les traits résolvent beaucoup de problèmes avec l’inheritance multiple mais permettent la réutilisation du code.

Si vous connaissez le rbuy, les traits sont similaires aux mix-ins

C’est le meilleur exemple que j’ai vu

Scala en pratique: Traits de composition – Style Lego: http://gleichmann.wordpress.com/2009/10/21/scala-in-practice-composing-traits-lego-style/

  class Shuttle extends Spacecraft with ControlCabin with PulseEngine{ val maxPulse = 10 def increaseSpeed = speedUp } 
 package ground.learning.scala.traits /** * Created by Mohan on 31/08/2014. * * Stacks are layered one top of another, when moving from Left -> Right, * Right most will be at the top layer, and receives method call. */ object TraitMain { def main(args: Array[Ssortingng]) { val strangers: List[NoEmotion] = List( new Stranger("Ray") with NoEmotion, new Stranger("Ray") with Bad, new Stranger("Ray") with Good, new Stranger("Ray") with Good with Bad, new Stranger("Ray") with Bad with Good) println(strangers.map(_.hi + "\n")) } } trait NoEmotion { def value: Ssortingng def hi = "I am " + value } trait Good extends NoEmotion { override def hi = "I am " + value + ", It is a beautiful day!" } trait Bad extends NoEmotion { override def hi = "I am " + value + ", It is a bad day!" } case class Stranger(value: Ssortingng) { } 
 Sortie:

 Liste (je suis Ray
 , Je suis Ray, c'est une mauvaise journée!
 , Je suis Ray, c'est une belle journée!
 , Je suis Ray, c'est une mauvaise journée!
 , Je suis Ray, c'est une belle journée!
 )

Les traits sont utiles pour mélanger des fonctionnalités dans une classe. Jetez un coup d’œil à http://scalatest.org/ . Notez comment vous pouvez mélanger divers langages spécifiques au domaine (DSL) dans une classe de test. Consultez le guide de démarrage rapide pour découvrir certaines des DSL sockets en charge par Scalatest ( http://scalatest.org/quick_start )

Semblables aux interfaces Java, les traits permettent de définir des types d’objects en spécifiant la signature des méthodes sockets en charge.

Contrairement à Java, Scala permet de mettre en œuvre partiellement les traits. c’est-à-dire qu’il est possible de définir des implémentations par défaut pour certaines méthodes.

Contrairement aux classes, les traits peuvent ne pas avoir de parameters de constructeur. Les caractères sont comme des classes, mais définissent une interface de fonctions et de champs que les classes peuvent fournir des valeurs et des implémentations concrètes.

Les traits peuvent hériter d’autres traits ou de classes.

Je cite le site du livre Programming in Scala, First Edition et plus précisément la section intitulée « Traiter ou ne pas qualifier ? » Du chapitre 12.

Chaque fois que vous implémentez une collection de comportements réutilisable, vous devez décider si vous souhaitez utiliser un trait ou une classe abstraite. Il n’y a pas de règle ferme, mais cette section contient quelques lignes direcsortingces à prendre en compte.

Si le comportement ne sera pas réutilisé, faites-en une classe concrète. Ce n’est pas un comportement réutilisable après tout.

S’il peut être réutilisé dans plusieurs classes non apparentées, faites-en un trait. Seuls les traits peuvent être mélangés dans différentes parties de la hiérarchie des classes.

Il y a un peu plus d’informations dans le lien ci-dessus concernant les traits et je vous suggère de lire la section complète. J’espère que ça aide.