Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 多重继承对于语言消费者或语言开发人员来说是复杂的?_Oop_Inheritance - Fatal编程技术网

Oop 多重继承对于语言消费者或语言开发人员来说是复杂的?

Oop 多重继承对于语言消费者或语言开发人员来说是复杂的?,oop,inheritance,Oop,Inheritance,到目前为止,在我阅读的文章中,提到实现多重继承会增加复杂性。但我想知道这是否增加了消费者开发人员或语言开发人员的复杂性 比方说,我们可以这样做来消除歧义: class Artist{ public void Draw(){ } } class Cowboy { public void Draw() { } } class Person : Artist, Cowboy{ } 在这里,我们似乎有两个相同的签名方法,但是像this.base.Artist.Draw()或this.

到目前为止,在我阅读的文章中,提到实现多重继承会增加复杂性。但我想知道这是否增加了消费者开发人员或语言开发人员的复杂性

比方说,我们可以这样做来消除歧义:

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()
  • (新人()).base.Cowboy.Draw()
  • ((Person)someInstance.base.Cowboy.Draw()
  • this.base.Cowboy.Draw()
  • 等等

  • 如果对基类成员的每次访问都必须在适当的基类名称之前加上前缀,那么从基类继承又有什么意义呢?可以说,它基本上与只生成Person类的基类属性相同

    另一个要考虑的是虚拟表在使用多重继承时的复杂性。以C++为例,多继承增加了虚拟表的大小和复杂度,从而降低了查找性能。


    最近我接手了一个项目,它有两个不同的类,具有多重继承(一个继承自8个类,另一个继承自6个类)。通过重构类以使用“HAS-A”关系而不是“IS-A”关系,我实现了5%的性能提升。虽然这是一个极端的情况,但它可以证明多重继承可能产生的影响。

    如果对基类成员的每次访问都必须在适当的基类名称前加上前缀,那么从基类继承又有什么意义呢?可以说,它基本上与只生成Person类的基类属性相同

    另一个要考虑的是虚拟表在使用多重继承时的复杂性。以C++为例,多继承增加了虚拟表的大小和复杂度,从而降低了查找性能。


    最近我接手了一个项目,它有两个不同的类,具有多重继承(一个继承自8个类,另一个继承自6个类)。通过重构类以使用“HAS-A”关系而不是“IS-A”关系,我实现了5%的性能提升。虽然这是一个极端的例子,但它证明了多重继承可能产生的影响。

    问得好。我认为应该由程序员来思考如何解决类外的歧义?菱形问题:@SimonSvensson可能,
    (newperson())。Draw()
    会因为歧义而无法完成。因此,这样的计划会加剧脆弱的基础阶级问题。我认为这个问题已经被问过很多次了。我希望.Net有多重继承,但这不会发生。问得好。我认为应该由程序员来思考如何解决类外的歧义?菱形问题:@SimonSvensson可能,
    (newperson())。Draw()
    会因为歧义而无法完成。因此,这样的计划会加剧脆弱的基础阶级问题。我认为这个问题已经被问过很多次了。我希望.Net有多重继承,但这不会发生。