Quel est l'avantage d'utiliser une classe abstraite au lieu d'un trait (en dehors de la performance)? Il semble que les classes abstraites puissent être remplacées par des traits dans la plupart des cas.
Je peux penser à deux différences
Odersky et al. Programmer en Scala vous conseillent d'utiliser des traits lorsque vous en doutez. Vous pouvez toujours les modifier ultérieurement en classes abstraites si nécessaire.
Outre le fait que vous ne pouvez pas étendre directement plusieurs classes abstraites, mais que vous pouvez mélanger plusieurs traits dans une classe, il convient de mentionner que les traits sont empilables, car les super appels dans un trait sont liés de manière dynamique (il s'agit d'une classe ou d'un trait mélangé auparavant). l'actuel).
De la réponse de Thomas dans Différence entre la classe abstraite et le trait :
trait A{
def a = 1
}
trait X extends A{
override def a = {
println("X")
super.a
}
}
trait Y extends A{
override def a = {
println("Y")
super.a
}
}
scala> val xy = new AnyRef with X with Y
xy: Java.lang.Object with X with Y = $anon$1@6e9b6a
scala> xy.a
Y
X
res0: Int = 1
scala> val yx = new AnyRef with Y with X
yx: Java.lang.Object with Y with X = $anon$1@188c838
scala> yx.a
X
Y
res1: Int = 1
Lors de l'extension d'une classe abstraite, cela montre que la sous-classe est du même type. Ce n'est pas nécessairement le cas lorsque vous utilisez des traits, je pense.
Dans Scala de programmation , les auteurs disent que les classes abstraites établissent une relation classique "est-a" orientée objet tandis que les traits sont une manière de composition.
Les classes abstraites peuvent contenir un comportement - Elles peuvent être paramétrées avec les arguments du constructeur (que les traits ne peuvent pas) et représenter une entité active. Les traits représentent plutôt une seule fonctionnalité, une interface d'une fonctionnalité.