2009-05-29 8 views

Répondre

182
  1. Les mixines peuvent contenir des états, les caractères (traditionnels) ne le sont pas.
  2. Les mixins utilisent la "résolution de conflit implicite", les traits utilisent la "résolution de conflit explicite"
  3. Les mixines dépendent de la linéarisation, les traits sont aplatis.

Lecture about traits

ad 1. Dans mixins vous pouvez définir des variables d'instance. Les traits ne le permettent pas. L'état doit être fourni en composant la classe (= classe en utilisant les caractères)

ad 2. Il peut y avoir un conflit de nom. Deux mixins (MA et MB) ou des traits (TA et TB) définissent un procédé avec la même définition foo():void.

Mixin MA { 
    foo():void { 
     print 'hello' 
    } 
} 

Mixin MB { 
    foo():void { 
     print 'bye' 
    } 
} 

Trait TA { 
    foo():void { 
     print 'hello' 
    } 
} 

Trait TB { 
    foo():void { 
     print 'bye' 
    } 
} 

En mixins les conflits dans la composition de la classe C mixins MA, MB sont résolus implicitement.

Class C mixins MA, MB { 
    bar():void { 
     foo(); 
    } 
} 

Ceci appellera foo():void de MA

D'autre part en utilisant les traits, la classe de composition doit résoudre les conflits.

Class C mixins TA, TB { 
    bar():void { 
     foo(); 
    } 
} 

Ce code provoquera un conflit (deux définitions de foo():void).

ad 3. La sémantique d'un procédé ne dépend pas de savoir si elle est définie dans un trait ou d'une classe qui utilise le trait. En d'autres termes, peu importe si la classe est composée du code Traits ou Traits, elle est "copiée-collée" dans la classe.

+9

+1 J'ai beaucoup aimé votre réponse. Il était concis et décrit la différence entre les deux très clairement. Je vous remercie! – Tower

+1

S'il y avait une liste de réponses exemplaires, ce serait certainement sur elle. Merci, jk_. – Reece

+5

Je sais que c'est une date antérieure, mais pour les futurs lecteurs, dans ruby ​​il utiliserait la méthode du dernier module qui était mélangé, donc il appellerait foo() forme MB –

7

Ces pages expliquent la différence dans le langage de programmation D.

http://dlang.org/mixin.html

http://dlang.org/traits.html

Mixins dans ce contexte sont le code généré à la volée, puis inséré à ce point dans le code lors de la compilation. Très pratique pour les simples DSL. Les caractères sont des valeurs externes à la compilation (plutôt que du code généré à partir d'une source externe). La différence est subtile. Les Mixins ajoutent une logique, les Traits ajoutent des données telles que des informations de type à la compilation. Je ne sais pas grand chose sur Ruby, mais j'espère que cela aide un peu.

+35

Les Mixins et Traits en D sont complètement différents de ce que les termes signifient en informatique en général. En D, les deux sont des primitives de préprocesseur pour la génération automatique de code. Dans d'autres langues, ce sont des mécanismes d'héritage. La décision de nommer dans D est malheureuse. – tylerl

Questions connexes