web-dev-qa-db-fra.com

Différence entre classe abstraite et caractère

Duplicata possible:
traits Scala vs classes abstraites

Quelle est la différence conceptuelle entre les classes abstraites et les traits?

90
Red Hyena

Une classe ne peut étendre qu'une superclasse , et donc, qu'une seule classe abstraite. Si vous souhaitez composer plusieurs classes, la méthode Scala consiste à utiliser composition de la classe mixin : vous combinez une superclasse (facultative), vos propres définitions de membres et une ou plusieurs - traits . Un trait est limité par rapport aux classes en ce qu'il ne peut pas avoir de paramètres constructeur (comparer le manuel de référence scala ).

Les restrictions des traits par rapport aux classes sont introduites pour éviter les problèmes typiques d'héritage multiple. Il existe des règles plus ou moins compliquées concernant la hiérarchie d'héritage; il vaut peut-être mieux éviter une hiérarchie là où cela compte réellement. ;-) Pour autant que je comprends, cela ne peut avoir d'importance que si vous héritez de deux méthodes avec la même signature/deux variables avec le même nom de deux traits différents.

70
Hans-Peter Störr

Un aspect des traits est qu'ils sont un empilables. Permettre une forme contrainte d'AOP (autour des conseils).

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

La résolution de super reflète la linéarisation de la hiérarchie d'héritage.

53
Thomas Jung

Conceptuellement, un trait est une composante d'une classe, pas une classe en soi. En tant que tel, il n'a généralement pas de constructeurs et il n'est pas censé "se tenir par lui-même".

Je suggère d'utiliser une classe abstraite lorsqu'elle a une signification indépendante et des traits lorsque vous souhaitez simplement ajouter des fonctionnalités de manière orientée objet. Si vous n'êtes pas sûr entre les deux, vous pourriez constater que si toutes vos méthodes tournent autour de faire une seule chose, vous voulez probablement un trait.

Pour un exemple (non spécifique à la langue), si votre employé doit étendre à la fois "Person" et "Cloneable", faites de Person une classe de base et de Cloneable un trait.

14
Oak

Au moins dans Scala, le système de traits a un moyen explicite de déclarer la priorité des parents dans une sous-classe pour éviter les problèmes typiques associés à l'héritage multiple, c'est-à-dire les conflits avec les méthodes héritées ayant la même signature.

Les traits sont semblables à Java interfaces, mais sont autorisés à avoir des implémentations de méthode.

5
Illotus