Mixins和Traits的区别?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (30)

Mixins和Traits有什么区别?

提问于
用户回答回答于

Mixins可能包含状态,(传统)特征不包含。

Mixins使用“隐式冲突解决”,特征使用“显式冲突解决”

Mixins依赖于线性化,性状变平。

在mixins中,可以定义实例变量。

可能存在名称冲突。在两个mixin(MAMB)或traits(TATB)定义了具有相同定义的方法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'
    }
}

在mixin中,构成类C mixins MA, MB 中的冲突被隐含地解决。

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

这将调用foo():void来自MA

另一方面,在使用特质的时候,作文课必须解决冲突。

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

这段代码会引发冲突(两个定义foo():void)。

方法的语义不取决于它是在特征还是在使用特征的类中定义的。

换句话说,这个类是由Traits还是Traits代码被“复制 - 粘贴”到类中并不重要。

用户回答回答于

这些页面解释了D编程语言中的差异。

http://dlang.org/mixin.html

http://dlang.org/traits.html

在这种情况下,Mixin是动态生成的代码,然后在编译期间在代码中插入。简单的DSLs非常方便。

特征是编译时的外部值(而不是从外部源生成的代码)。Mixins添加逻辑,Traits添加编译时类型信息等数据。

扫码关注云+社区