Ruby,Java等中的多重继承

时间:2011-09-21 18:32:01

标签: java ruby multiple-inheritance

这可能听起来很愚蠢,但是如果每个类都隐式扩展了Object类,并且允许再扩展一个类,那么它怎么不是多重继承呢?从用户的角度来看,可能有人认为它们不支持多重继承,因为不允许用户扩展多个类。但是,这些语言似乎具有对多重继承的内部支持,而这种继承只是为了保持简单而不向用户公开。我有道理吗?

注意:我不是支持或反对支持多重继承。只是想澄清一些想法。

4 个答案:

答案 0 :(得分:7)

典型的OO系统支持派生类的(具有任意长度)。从任何一个子类的角度来看,父母形成一个回到Object的链。一次查看所有类,我们看到类层次结构实际上是一个树,在Object下面有一个非常宽的扇出。

什么是 not 典型的是允许树上的两个分支在指向多个超类的类中再次合并,具体是“多重继承”意味着什么

你是正确的,在英语意义上它可能是“多重”,但在OO意义上不是“多重”,最终能够将单个对象传递给多个接口,每个接口都需要一个不相关的父对象类。

解决此限制的一种方法也很典型,这就是为什么你在Java中使用接口并在Ruby中包含(“mixin”)模块的原因。

答案 1 :(得分:2)

您描述的情况只是纯继承,它与多重继承没有任何共同之处。例如,在Java中,我们Integer继承自Number,而Number继承自Object

具有多重继承的语言的标准示例是C ++

class A { };
class B { };
class C { };
class X : public A, private B, public C { };

而在Java中我们有

class A { }
class B extends A { }
class C extends B { }
class X extends C { }

就多重继承而言,Ruby类似于Java(ruby中的类只能有一个祖先)。然而,Ruby提供了“充当”多重继承的不同机制,即模块

# class XX inherits from CC
class AA 
end
class BB < AA
end
class CC < BB
end
class XX < CC
end

# class X mixin A,B,C modules
module A end
module B end
module C end
class X 
    include A
    include B
    include C
end

在Ruby中(类似于Java),类AA具有默认的祖先(继承链依赖于Ruby版本)

X.ancestors
[X, C, B, A, Object, Kernel, BasicObject]
XX.ancestors
[XX, CC, BB, AA, Object, Kernel, BasicObject]

答案 2 :(得分:1)

不同之处在于,“真正的”多重继承允许您从不同类树中的差异类中进行加密。如果你的子类继承的两个类具有相似的属性或方法,那么问题就变成了你必须处理孩子中的冲突。

在Java等不允许多重继承的语言中,相同的成员只是被子类中的成员覆盖。

总之,即使您的类型层次结构中有多个类,您也只能拥有每个成员的一个版本,因为每个子成员都会覆盖父成员。

答案 3 :(得分:0)

正如您所注意到的,Java中的所有引用类型都是java.lang.Object

定义自定义类型的开发人员可以使用一个实现进行扩展。您可以选择实现多个接口,但这些接口不带任何实现。开发人员必须添加自己的。

因此,当您说Java中的自定义类型从java.lang.Object和扩展超类接收实现时,您可能是严格正确的,但它被认为是实现的单一继承,因为开发人员只能扩展一个实现类。

你在争论语义。您无法在Java中扩展多个实现。

可以实现多个接口。