多重继承是面向对象
编程语言中的一个重要概念,它允许一个类同时继承多个父类的行为和特征。
多重继承的概念可能会引起一些混乱情况,因此其优缺点经常受到争议。Java采用了一种妥协方案,即允许一个类继承多个父接口,但仅能从一个父类继承具体实现。类似地,
微软的.NET编程语言如
C#和Visual Basic .NET以及REAL
软件的REALbasic也采用了这一做法。
在面向对象的程序设计中,继承描述了两种类型的对象之间的关系,其中一个对象是另一个对象的"子类型"或"子类"。子类通过继承获得了父类的特征,从而实现了代码复用。例如,可以创建一个"Mammal"类,具有吃东西和繁殖等功能,然后定义一个"Cats"子类,它可以继承这些功能而无需重复编写代码,并添加自己特有的功能,如"抓老鼠"。然而,当希望一个类同时继承多个结构时,如让"Cats"不仅继承"Mammal",还继承"Toon"和"Pets",由于缺乏多重继承的支持,通常会导致复杂的混合继承或者不得不在一个以上的地点重复实现同一功能,这会给维护带来挑战。
不同的
编程语言对多重继承的处理方式有所不同。例如,
Eiffel允许子类通过重命名或预先确定的选择规则来适应继承而来的方法。Java允许对象从多个接口继承,但仅允许一个实现继承。REALbasic与其相似,并提供了一种不需要使用继承的方式来"扩展"一个类的功能。
Perl使用了一种按序列表的继承机制,在查找方法时,首先查找当前类的方法,然后按照深度优先搜索的方式依次查找各继承类及其父类。Common Lisp Object System (CLOS)允许程序员完全控制方法的组合。如果这还不够,元对象协议提供了修改继承、方法调度、类特殊化以及其他内部机制的手段,而不会影响系统的稳定性和安全性。