特性和多重继承之间有什么概念上的区别?

AsT*_*TeR 5 language-agnostic multiple-inheritance traits

根据我所读到的内容和我所看到的,我认为多重继承是一种不好的做法,不是因为它本身,而是因为它导致初学者在任何地方使用更优雅的设计模式可能有用且更有意义的地方。

有些语言选择不实现多重继承,然后选择实现特征(例如 PHP)。我看到的多重继承和特征之间唯一有趣且实质性的区别是语言上的区别:虽然“继承”表示某种共享的性质,但“特征”更多地代表特征。

我是否遗漏了任何其他重要的区别来解释为什么有些人认为多重继承是不合适的,而现在特征是合适的?

Nan*_*nne 4

您可以使用特征来伪造多重继承,但我相信基本的区别是概念上的区别。父子关系是“is-a”关系。

如果你有一个 Furniture 类,有一个 Table 子项和一个 PicknickTable 子项,那么你有 Picknicktable is-a Table is-a Furniture (嗯,家具是这样可数的吗?nvrmnd)。

对于特征,你只需说:我讨厌继续编写代码以将东西放在表面上,所以我编写了“putStuffOnThisThing”特征,并且他们拥有了它。这不是继承!这种推理背后的基本错误可能是你想将特征视为显示层次结构的不同方式,但你不应该这样做。它不能替代实际的良好设计,它是工具箱中的一个技巧,您可能会滥用它来实现多重继承,但您可能最好将其用作避免多次编写某些行的方法。

因此,为了捍卫比较:特征具有一些与多重继承相同的问题,例如在多个同名事物的情况下需要使用别名来解决的问题。虽然这不完全是钻石问题,但它非常接近。