【问题标题】:Ruby inheritance and instancesRuby 继承和实例
【发布时间】:2016-01-26 14:21:04
【问题描述】:

我创建了一个类User(它是Class 的一个实例),并使它继承自类Person。是什么让这被认为不是多重继承?它不是从Class 继承了new 之类的实例方法以及Person 提供的任何方法吗?

也就是说,这怎么不是多重继承:

class User < class Person
  some methods here...
end

当User 已经继承了Class 的所有方法时?以下不是幕后发生的事情吗?

class User < class Person and class Class
end

【问题讨论】:

  • 嘿,我编辑了我的评论以更具体。那篇文章更多地是关于从字面上指定两个父类,而我的问题是,当它的父类看起来像“类”类时,ruby 中的任何类如何将另一个类列为父类...
  • 您的代码不是有效的 Ruby 语法。 User 不是Class 的孩子,它是Class 类的实例
  • “多重继承”作为一种语言的一个特性是暴露给该语言的用户的。这对于 Ruby 用户来说实际上并没有作为多重继承有用;你不能从两个任意的类继承。
  • new 不是实例方法。

标签: ruby


【解决方案1】:

如果你打开 irb 你可以自己检查。键入User.superclass,您会看到User 只有一个超类,即Person。 User 将继承 Object 的方法,因为 Person 的超类是 Object

【讨论】:

  • 谢谢你真的把事情弄清楚了!让我感到困惑的是,我没有意识到一切都很好地融入了一个大的指挥链!即使 User 和 Person 是“Class”类的实例,如果你执行 Class.superclass 你会得到 Module,如果你使用它的超类,你就会回到 Object!这一切都来了一个完整的循环!!!谢谢!
【解决方案2】:

它不是通常的“多重继承”,而是一个简单的继承链。

除非您从initialize 显式调用祖先,否则祖先不能拥有自己的构造函数,而在复杂的层次结构中,这可能非常痛苦。 主要的一点是只有一个实例对象,它是共享的,并且混合了方法。

在 ruby​​ 中,类层次结构始终是一棵树。即使是看起来像多重继承的 mixin,在内部也被实现为继承链。

真正的多重继承可能很难,例如在 C++ 中:

class A {}
class B: public A{}
class C: public A{}
class D: public B, public C{}

D 中应该有多少个 A 实例? (“钻石问题”)

Ruby 只是通过没有原因来避免它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 2012-12-03
    相关资源
    最近更新 更多