Mixins和Traits有什么区别?

According to Wikipedia,Ruby模块有点像特性。为何如此?

最佳答案

  • Mixins可能包含状态,(传统)特征不包含。
  • Mixins使用“隐式冲突解决方案”,特征使用“显式冲突解决方案”
  • Mixins依赖于线性化,特征被展平。

  • Lecture about traits

    广告1.
    在mixins中,您可以定义实例变量。特质不允许这样做。必须通过构成类(=使用类的类)来提供状态

    广告2.
    可能存在名称冲突。两个混合(MAMB)或特征(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
    另一方面,在使用“特质”时,编写类必须解决冲突。
    Class C mixins TA, TB {
        bar():void {
            foo();
        }
    }
    

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

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

    换句话说,该类由Traits组成还是将Traits代码“复制-粘贴”到该类中都没有关系。

    关于multiple-inheritance - Mixins vs.特质,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/925609/

    10-10 07:12