我认为Ruby除了mixin之外只允许单一继承。但是,当我有Square
继承 class的类Thing
时,默认情况下Thing
会继承Object
。
class Thing
end
class Square < Thing
end
这不代表多重继承吗?
我认为Ruby除了mixin之外只允许单一继承。但是,当我有Square
继承 class的类Thing
时,默认情况下Thing
会继承Object
。
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
所以在这个例子中,Thing 类将有一些来自 MathFunctions 模块的方法,Taggable 和 Persistence,这不可能使用简单的类继承。
如果 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。
多重继承——这在 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 中只有一个多级继承链,这使得类的多个直接父级无效。