multiple inheritance - Mixins vs. Rasgos
multiple-inheritance paradigms (2)
- Mixins puede contener estado, los rasgos (tradicionales) no.
- Los mixins usan "resolución implícita de conflictos", los rasgos usan "resolución explícita de conflictos"
- Mixins depende de la linealización, los rasgos se aplanan.
anuncio 1. En mixins puede definir variables de instancia. Los rasgos no permiten esto. El estado debe proporcionarse componiendo la clase (= clase usando los rasgos)
anuncio 2. Puede haber 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 implícitamente.
Class C mixins MA, MB {
bar():void {
foo();
}
}
Esto llamará a foo():void
de MA
Por otro lado, al usar Traits, componer clases tiene que resolver conflictos.
Class C mixins TA, TB {
bar():void {
foo();
}
}
Este código generará conflictos (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 usa 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.
¿Cuál es la diferencia entre Mixins y Rasgos?
Según Wikipedia , los Ruby Modules son algo así como rasgos. ¿Cómo es eso?
Estas páginas explican la diferencia en el lenguaje de programación D.
Mixins en este contexto son código generado sobre la marcha, y luego se inserta en ese punto en el 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.