web-dev-qa-db-fra.com

Quel est l'avantage d'utiliser des classes abstraites au lieu de traits?

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.

358
Ralf

Je peux penser à deux différences

  1. Les classes abstraites peuvent avoir des paramètres de constructeur ainsi que des paramètres de type. Les traits ne peuvent avoir que des paramètres de type. Il a été question à l’avenir que même les traits peuvent avoir des paramètres de constructeur
  2. Les classes abstraites sont totalement interopérables avec Java. Vous pouvez les appeler à partir du code Java sans wrappers. Les caractères ne sont totalement interopérables que s'ils ne contiennent aucun code d'implémentation
357
Mushtaq Ahmed

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.

75
Daniel C. Sobral

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
19
Nemanja Boric

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.

9
peter p

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.

7
CQQL

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é.

5
Dario
  1. Une classe peut hériter de plusieurs traits mais d'une seule classe abstraite.
  2. Les classes abstraites peuvent avoir des paramètres de constructeur ainsi que des paramètres de type. Les traits ne peuvent avoir que des paramètres de type. Par exemple, vous ne pouvez pas dire trait t (i: Int) {}; le paramètre i est illégal.
  3. Les classes abstraites sont totalement interopérables avec Java. Vous pouvez les appeler à partir du code Java sans wrappers. Les caractères ne sont totalement interopérables que s'ils ne contiennent aucun code d'implémentation.
1
pavan.vn101