行为定义回调,协议定义没有签名的方法。实现协议的模块应为所有这些方法提供定义。使用行为的模块也是如此。语义上有什么区别?
我能想到的一个区别是,一个协议只能为一种类型实现一次,因为我们可以根据我们的要求为模块多次实现行为。我清楚何时使用什么。除此之外还有其他区别吗?
协议是基于类型/数据的多态性。当我打电话时Enum.each(foo, ...)
,具体的枚举是根据的类型确定的foo
。
行为是一种无类型的插件机制。当我调用时GenServer.start(MyModule)
,我明确地将其MyModule
作为插件传递,并且GenServer
在需要时来自的通用代码将调用此模块。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句