36

我认为Ruby除了mixin之外只允许单一继承。但是,当我有Square继承 class的类Thing时,默认情况下Thing会继承Object

class Thing
end

class Square < Thing
end

这不代表多重继承吗?

4

4 回答 4

78

我认为您以错误的方式理解多重继承的含义。可能你想到的多重继承是这样的:

class A inherits class B
class B inherits class C

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

class A inherits class B
class A inherits class C

你肯定不能在 Ruby 中做到这一点。

于 2012-04-20T23:19:35.217 回答
30

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

class Thing
  include MathFunctions
  include Taggable
  include Persistence
end

所以在这个例子中,Thing 类将有一些来自 MathFunctions 模块的方法,Taggable 和 Persistence,这不可能使用简单的类继承。

于 2012-04-20T23:21:20.547 回答
11

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

class A
end

class B < A
  attr_accessor :editor
end

Ruby 具有单继承,即每个类都有一个且只有一个父类。Ruby 可以使用 Modules(MIXINs) 模拟多重继承

module A
  def a1
  end

  def a2
  end
end

module B
  def b1
  end

  def b2
  end
end

class Sample
  include A
  include B

  def s1
  end
end


samp=Sample.new
samp.a1
samp.a2
samp.b1
samp.b2
samp.s1

模块 A 由方法 a1 和 a2 组成。模块 B 由方法 b1 和 b2 组成。Sample 类包括模块 A 和 B。Sample 类可以访问所有四种方法,即 a1、a2、b1 和 b2。因此,您可以看到 Sample 类继承自两个模块。因此,您可以说 Sample 类显示了多重继承或 mixin。

于 2013-07-21T19:25:17.090 回答
8

多重继承——这在 ruby​​ 中是绝对不可能的,即使是模块也不可能。

多级继承-即使使用模块,这也是可能的。

为什么 ?

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

例1:

class A
end
class B < A
end

这是一个正常的继承链,你可以通过祖先来检查。

B.ancestors => B -> A -> 对象 -> ..

继承与模块 -

例 2:

module B
end
class A
  include B
end

上述示例的继承链 -

B.ancestors => B -> A -> 对象 -> ..

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

例 3:

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.ancestors => A -> C -> B -> 对象 -> ..

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

所以,

A.new.name => "this is C"

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

所以,

在任何时候,ruby 中只有一个多级继承链,这使得类的多个直接父级无效。

于 2016-03-02T05:41:22.600 回答