Ruby中的多重继承?

Ruby中的多重继承?,ruby,inheritance,Ruby,Inheritance,我认为除了mixin之外,Ruby只允许单一继承。但是,当我有继承类东西的类Square时,东西在默认情况下依次继承对象 class Thing end class Square < Thing end 类的东西 结束 阶级广场 结束 这不代表多重继承吗?我认为你误解了多重继承的含义。您心目中的多重继承可能是这样的: class A inherits class B class B inherits class C 如果是这样,那就错了。这不是多重继承,Ruby对此没有问题。多重继

我认为除了mixin之外,Ruby只允许单一继承。但是,当我有继承类
东西的类
Square
时,
东西
在默认情况下依次继承
对象

class Thing
end

class Square < Thing
end
类的东西
结束
阶级广场
结束

这不代表多重继承吗?

我认为你误解了多重继承的含义。您心目中的多重继承可能是这样的:

class A inherits class B
class B inherits class C
如果是这样,那就错了。这不是多重继承,Ruby对此没有问题。多重继承的真正含义是:

class A inherits class B
class A inherits class C

在Ruby中当然不能这样做。

不,多重继承意味着一个类有多个父类。例如,在ruby中,您可以在以下模块中使用该行为:

class Thing
  include MathFunctions
  include Taggable
  include Persistence
end

所以在这个例子中,这个类将有一些来自MathFunctions模块、标记和持久性的方法,这是不可能使用简单的类继承的。

如果类B继承自类A, 那么B的实例具有A类和B类的行为

class A
end

class B < A
  attr_accessor :editor
end
模块A包括方法a1和a2。模块B包括方法b1和b2。类示例包括模块A和模块B。类示例可以访问所有四种方法,即a1、a2、b1和b2。因此,您可以看到类示例继承了这两个模块。因此,您可以说类示例显示了多重继承或混合。

-这在ruby中是绝对不可能的,即使是在模块中。

-即使使用模块,这也是可能的。

为什么?

模块充当包含它们的类的绝对超类

例1:

class A
end
class B < A
end
上面例子中的继承链-

祖先=>B->A->Object->

这与Ex1完全相同。这意味着模块B中的所有方法都可以重写A中的方法,并且它充当了一个真正的类继承

例3:

A.祖先=>A->C->B->Object->

如果您看到最后一个示例,即使包含了两个不同的模块,它们也位于单个继承链中,其中B是C的超类,C是a的超类

所以

如果从模块C中删除name方法,上述代码将返回“this is B”。这与继承类相同

所以,


在任何一点上,ruby中只有一个多级继承链,它使类的多个直接父级无效。即使使用mixin,所有东西都被放入一个线性继承链中。一个简单的谷歌搜索将能够明确什么是多重继承。如果您在这里试图找出include和extend之间的区别,或者理解如何使用include来实现多重继承,请参见Do note,但是,MathFunctions、Taggable和Persistence都是按包含顺序插入继承层次结构的。。。它们在继承层次结构中的位置不同。另外,您包括模块而不是类。@d11wtq在Python中对于多重继承是相同的。在Ex 2:B中,祖先将只打印[B]我想您是在尝试编写A.祖先。
class A
end
class B < A
end
module B
end
class A
  include B
end
module B
  def name
     p "this is B"
  end
end
module C
  def name
     p "this is C"
  end
end
class A
  include B
  include C
end
A.new.name => "this is C"