Mixins vs. Traits

Kap*_*old 146 paradigms multiple-inheritance traits mixins

Mixins和Traits有什么区别?

根据维基百科,Ruby模块有点像特征.怎么会这样?

jk_*_*jk_ 209

  1. Mixins可能包含状态,(传统)特征则不包含状态.
  2. Mixins使用"隐式冲突解决",特征使用"显式冲突解决"
  3. Mixins取决于线性化,性状变平.

关于特质的讲座

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

广告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'
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Class C mixins MA, MB {
    bar():void {
        foo();
    }
}
Run Code Online (Sandbox Code Playgroud)

这将foo():void来自MA

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

Class C mixins TA, TB {
    bar():void {
        foo();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

换句话说,无论何时该类由Traits组成,Traits代码都是"复制粘贴"到类中.

  • +1我很喜欢你的答案.它简洁明了,非常清楚地描述了两者之间的区别.谢谢! (10认同)
  • 我知道这是一年过去的日期,但是对于未来的读者来说,在ruby中它将使用混合的最后一个模块的方法,因此它将调用foo()形式MB (5认同)
  • 在Scala中,特征可以有字段,这意味着它们不是"传统"特征吗? (4认同)
  • 是的,这些都不是"传统的",它们被称为"有状态"特征.statefull tr​​aits和mixins之间的差异是第2点和第3点. (4认同)
  • 暂定-1; 在野外使用术语"特质"和"混合"的方式非常不一致,这里至少有一点是错误的.PHP和维基百科(以及@Sergio,也称Scala)不同意你的无状态特征.我没有发现这个答案有用,因为它是由裸露的断言组成的,而且我不清楚这不仅仅是你个人使用这些词语的方式.除非另有说服力,否则我需要看到很多关于如何在现实世界中使用术语(例如在实际编程语言中)来备份索赔的示例. (4认同)
  • @AykutKllic线性化 - >"编译器解决了什么是超级的问题,没有歧义." (http://www.ibm.com/developerworks/library/j-jn8/) (3认同)
  • 你对线性化有什么意思? (2认同)
  • 您是否愿意详细说明*"Mixins依赖于线性化,特征是扁平的"*部分?我不确定我是否理解它. (2认同)

Aid*_*ell 8

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

http://dlang.org/mixin.html

http://dlang.org/traits.html

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

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

不太了解Ruby,但希望这有点帮助.

  • D中的Mixins和Traits与计算机科学中的术语完全不同.在D中,两者都是用于自动代码生成的预处理器原语.在其他语言中,它们是继承机制.D中的命名决定是不幸的. (40认同)