更新时间:2023-12-23 21:18
多重继承是编程语言中的概念,多重继承指的是一个类可以同时继承多个类,比如A类继承自B类和C类,这就是多重继承。
面向对象编程语言中的多重继承指的是一个类可以同时继承多个父类的行为和特征功能。单一继承是指:一个子类只继承一个父类。
多重继承指代可以导致某些令人混淆的情况,所以关于它的好处与风险之间孰轻孰重常常受人争论。Java使用了一个折中的办法:Java允许一个类别继承自多于一个父接口(可以指定某一个类别,它继承了所有父类的类型,并必须拥有所有父类别接口的外部可见方法的具体实现,并允许编译器强制以上要求),但只可以从一个父类别继承实现(方法与数据)。微软的.NET编程语言,例如C#和Visual Basic .NET和REAL Software的REALbasic也使用了这种类接口的做法。
面向对象的程序设计中,继承描述了两种类型或两个类的物件,其中一种是另外一种的“子类型”或“子类”。子类继承了父类的特征,允许分享功能。例如,可以创造一个“哺乳类动物” 类,拥有进食、繁殖等的功能;然后定义一个子类“猫”,它可以从父类继承上述功能,不需重新编写程序,同时增加属于自己的新功能,例如“追赶老鼠”。
然而,如果想同时自多于一个结构继承,例如容许“猫”继承“哺乳类动物”之余,同时继承“卡通角色”和“宠物”,缺乏多重继承往往会导致十分笨拙的混合继承,或迫使同一个功能在多于一个地方被重写。(这带来了维护上的问题)
多年以来,多重继承都是一个敏感的话题,反对者指它增加了程序的复杂性与含糊性,例如在“钻石问题”中。
各种编程语言有不同的方式处理上述问题。例如Eiffel容许子类型透过重新命名,或提前为他们确定选择规则,来适应(adapt)它继承得来的功能。Java允许对象从多个接口继承,但仅允许一个实现继承。REALbasic与它相似,并增加了一个不需使用继承来“扩展”一个类的功能。Perl使用一种有序列表式的继承机制:搜寻方法时,它会先搜寻当前类别的方法,然后使用深度优先搜索来顺序寻找各个继承类及其父类。CLOS允许程序设计者完全控制方法的组合。如果这还不足够,元对象协议给程序设计者一种手段去修改继承,方法调度,类别特例化,及其它内部的机制,而不影响系统的稳定性。