我认为Ruby除了mixin之外只允许单继承。但是,当我有继承类Square
的类Thing
时,Thing
会默认继承Object
。
class Thing
end
class Square < Thing
end
这不代表多重继承吗?
答案 0 :(得分:66)
我认为你正在以错误的方式理解多重继承的含义。可能你想到的是多重继承是这样的:
class A inherits class B
class B inherits class C
如果是这样,那就错了。这不是多重继承的原因,Ruby也没有问题。多重继承的真正含义是:
class A inherits class B
class A inherits class C
你肯定不能用Ruby做到这一点。
答案 1 :(得分:26)
不,多继承意味着一个类有多个父类。例如,在ruby中,您可以使用以下模块获得该行为:
class Thing
include MathFunctions
include Taggable
include Persistence
end
所以在这个例子中,Thing类会有一些来自MathFunctions模块,Taggable和Persistence的方法,使用简单的类继承是不可能的。
答案 2 :(得分:11)
如果B类继承自A类, 然后B的实例具有A类和B类行为
class A
end
class B < A
attr_accessor :editor
end
Ruby具有单一继承,即每个类只有一个父类。 Ruby可以使用模块(MIXIN)
模拟多重继承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。
答案 3 :(得分:7)
Multiple inheritance - 这在ruby中绝对不可能,甚至没有模块。
multilevel inheritance - 即使使用模块,这也是可能的。
为什么?
模块充当包含它们的类的绝对超类。
Ex1:
class A
end
class B < A
end
这是一个普通的继承链,你可以通过祖先来检查它。
B.ancestors =&gt; B - &gt; A - &gt;对象 - &gt; ..
继承模块 -
Ex2:
module B
end
class A
include B
end
以上示例的继承链 -
B.ancestors =&gt; B - &gt; A - &gt;对象 - &gt; ..
与Ex1完全相同。这意味着模块B中的所有方法都可以覆盖A中的方法,并且它充当真正的类继承。
Ex3:
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 =&gt; A - &gt; C - &gt; B - &gt;对象 - &gt; ..
如果您看到最后一个示例,即使包含两个不同的模块,它们也在一个继承链中,其中B是C的超类,C是A的超类。
所以,
A.new.name => "this is C"
如果从模块C中删除名称方法,则上面的代码将返回“this is B”。这与继承一个类相同。
<强>所以,强>
在任何时候,ruby中只有一个多级继承链,它使多个直接父级到该类无效。