Mixins vs. Traits

时间:2009-05-29 11:39:48

标签: multiple-inheritance mixins paradigms traits

Mixins和Traits有什么区别?

According to Wikipedia,Ruby Modules有点像特征。怎么样?

2 个答案:

答案 0 :(得分:203)

  1. Mixins可能包含状态,(传统)特征不包含。
  2. Mixins使用“隐式冲突解决”,特征使用“显式冲突解决”
  3. Mixins依赖于线性化,性状变平。
  4. Lecture about traits

    广告1。 在mixins中,您可以定义实例变量。特征不允许这样。状态必须由组成类(=使用特征的类)

    提供

    ad 2。 可能存在名称冲突。两个mixins(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'
        }
    }
    

    在mixins中,隐式地解决了编写类C mixins MA, MB中的冲突。

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

    这将从foo():void

    致电MA

    另一方面,在使用Traits时,编写类必须解决冲突。

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

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

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

    换句话说,无论是什么类,Traits或Traits代码都被“复制粘贴”到课堂上。

答案 1 :(得分:8)

这些页面解释了D编程语言的不同之处。

http://dlang.org/mixin.html

http://dlang.org/traits.html

此上下文中的Mixins是动态生成的代码,然后在编译期间在代码中插入。对于简单的DSL来说非常方便。

Traits是编译时外部值(而不是从外部源生成的代码)。差异很微妙。 Mixins添加逻辑,Traits添加数据,如编译时类型信息。

不太了解Ruby,但希望这有所帮助。