到目前为止,在我读过的文章中,提到实现多重继承增加了复杂性。但我想知道它是否增加了消费者开发者方或语言开发者方面的复杂性?
让我们说,我们可以做这样的事情来克服歧义:
class Artist{
public void Draw(){ }
}
class Cowboy {
public void Draw() { }
}
class Person : Artist, Cowboy{
}
这里似乎我们有两个相同的签名方法,但是this.base.Artist.Draw()
或this.base.Cowboy.Draw()
等语法以及类型之外的语法person.base.Cowboy.Draw()
看起来足以解决这种含糊不清。
那么我们在这里讨论的模糊性和复杂性是什么呢?那里有很多产品,但从消费者的角度来看,我们处理的产品并不复杂。
在许多情况下, base
关键字可以防止歧义:
person.base.Cowbow.Draw();
(new Person()).base.Cowboy.Draw();
((Person) someInstance).base.Cowboy.Draw();
this.base.Cowboy.Draw();
答案 0 :(得分:0)
如果对基类成员的每次访问都必须在前面添加适当的基类名,那么从基类继承的重点是什么?可以认为它基本上与只创建Person类的基类属性相同。
要考虑的另一件事是使用多重继承时虚拟表的复杂性。以c ++为例,多重继承会增加虚拟表的大小和复杂性,从而降低查找性能。
最近我接手了一个项目,它有两个不同的类,有多个继承(一个继承自8个类,另一个继承自6个)。简单地通过重构类来使用'HAS-A'关系而不是'IS-A'关系,我实现了5%的性能提升。虽然这是一个极端的例子,但它有助于证明多重继承可能产生的影响。