- Mixins may contain state, (traditional) traits don't.
- Mixins use "implicit conflict resolution", traits use "explicit conflict resolution"
- Mixins depends on linearization, traits are flattened.
Lecture about traits
ad 1.
In mixins you can define instance variables. Traits do not allow this. The state must be provided by composing class (=class using the traits)
ad 2.
There may be the name conflict. Two mixins (MA
and MB
) or traits (TA
and TB
) define method with the same definition 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'
}
}
In mixins the conflicts in composing class C mixins MA, MB
are resolved implicitly.
Class C mixins MA, MB {
bar():void {
foo();
}
}
This will call foo():void
from MA
On the other hand while using Traits, composing class has to resolve conflicts.
Class C mixins TA, TB {
bar():void {
foo();
}
}
This code will raise conflict (two definitions of foo():void
).
ad 3.
The semantics of a method does not depend of whether it is defined in a trait or in a class that uses the trait.
In other words, it does not matter wheter the class consists of the Traits or the Traits code is "copy - pasted" into the class.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…