2009-05-29 17 views

Respuesta

182
  1. Mixins puede contener estado, rasgos (tradicionales) no.
  2. Mixins utiliza "resolución implícita de conflictos", los rasgos utilizan "resolución explícita de conflictos"
  3. Mixins depende de la linealización, los rasgos se aplanan.

Lecture about traits

ad 1. En mixins se pueden definir variables de instancia. Los rasgos no permiten esto. El estado debe proporcionarse componiendo la clase (= clase utilizando los rasgos)

anuncio 2. Puede haber un conflicto de nombre. Dos mixins (MA y MB) o rasgos (TA y TB) definen el método con la misma definición 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 los conflictos en la composición de la clase C mixins MA, MB se resuelven de manera implícita.

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

Para ello, será foo():void de MA

Por otro lado durante el uso de rasgos, la composición de la clase tiene que resolver los conflictos.

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

Este código generará conflicto (dos definiciones de foo():void).

ad 3. La semántica de un método no depende de si se define en un rasgo o en una clase que utiliza el rasgo.

En otras palabras, no importa si la clase consiste en los rasgos o el código de los rasgos se "copia - pega" en la clase.

+9

+1 Me gustó mucho su respuesta. Fue conciso y describió la diferencia entre los dos muy claramente. ¡Gracias! – Tower

+1

Si hubiera una lista de respuestas ejemplares, seguramente estaría ahí. Gracias, jk_. – Reece

+5

Sé que es una fecha pasada, pero para futuros lectores, en ruby ​​usaría el método del último módulo que se mezcló, por lo que llamaría a foo() forma MB –

7

Estas páginas explican la diferencia en el lenguaje de programación D.

http://dlang.org/mixin.html

http://dlang.org/traits.html

Mixins en este contexto son el código generado sobre la marcha, y luego se inserta en ese punto de código durante la compilación. Muy útil para DSL simples.

Los rasgos son valores externos en tiempo de compilación (en lugar de códigos generados a partir de una fuente externa). La diferencia es sutil. Mixins agrega lógica, los rasgos agregan datos tales como información de tipo de tiempo de compilación.

No sé mucho sobre Ruby, pero espero que esto ayude un poco.

+35

Mixins y Rasgos en D son completamente diferentes de lo que significan los términos en Informática en general. En D, ambas son primitivas de preprocesador para la generación automática de código. En otros idiomas, son mecanismos de herencia. La decisión de nombrar en D es desafortunada. – tylerl