gpt4 book ai didi

ruby - Ruby 模块包含为什么不是真正的 'multiple inheritance' 以及 Ruby 风格如何避免与多重继承相关的问题?

转载 作者:数据小太阳 更新时间:2023-10-29 06:39:39 24 4
gpt4 key购买 nike

据说 Matz 说“mixins 几乎可以做多重继承做的所有事情,而没有相关的缺点”(Matz 的话)。

首先,为什么 Ruby 模块包含不是“多重继承”?在我看来,模块和类之间的区别很小。当模块用作父类(super class)时,不能实例化模块这一事实是无关紧要的。

我也知道,连续的模块包含形成了一个从类向上延伸的继承链(不是树)。但是,对我来说,这不足以将它与“多重继承”区分开来,因为 Python 多重继承系统也“线性化”了父类(super class)链(使用 C3 algorithm ),只是 Ruby 的“线性化”过程要简单得多。

那么,Ruby 模块混入与 Python 等语言中的多重继承究竟有什么区别呢?为什么 Python 采用 c3 MRO 算法背后的争论不适用于 Ruby?如果它们确实适用——为什么 Ruby 决定不采用这种算法?

谢谢

最佳答案

有了 MI,许多出现的问题都可以简化为实现细节;你不能只笼统地谈论“多重继承”,而不谈细节。因此,当您说“多重继承”时,我会假设您指的是“C++ 多重继承”。

多重继承最常见的问题是 Diamond Problem .如果同一级别的多个父类(super class)定义了相同的方法,您如何知道子类上调用了哪个方法?

有了模块,这个问题很容易解决——最后包含的模块总是“赢”。您不能像在 C++ 中使用类那样“同时”包含多个模块。所以这个问题永远不会出现。

The fact you cannot instantiate a module is irrelevant when it is used as a superclass

我谨表示不同意。

首先,模块在 ruby​​ 中永远不会“用作父类(super class)”;只有父类(super class)是。

其次,通过多重继承,准确知道构造函数(和析构函数!)的调用顺序是 not a trivial matter . ruby 模块不允许实例化这一事实完全抑制了该问题。

关于ruby - Ruby 模块包含为什么不是真正的 'multiple inheritance' 以及 Ruby 风格如何避免与多重继承相关的问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4033699/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com