Traits和多重继承的概念上有什么区别?

5
根据我所读和所见,我认为多重继承不是本身的问题,而是因为它会使初学者在更优雅的设计模式可能更有用和更有意义的地方使用它。
一些语言选择不实现多重继承,而选择实现traits(例如PHP)。我看到多重继承和traits之间唯一有趣且实质性的区别是语言上的区别:虽然“继承”表示某种共享性质,“trait”则更多地代表特征。
除此之外,还有其他重要的区别吗?这能解释为什么有些人认为多重继承不适当,而现在traits则适当吗?

可能是PHP:Traits vs. Interfaces的重复问题。 - Kye
1个回答

4
您可以使用traits来模拟多重继承,但我认为基本的区别在于概念上的差异。父子关系是一种“is-a”关系。
如果您有一个Furniture类,其中包含一个Table子类和一个PicknickTable子类,那么您就有了Picknicktable is-a Table is-a Furniture(嗯,像这样计算家具是否可数?不要紧)。
使用traits,您只需说:我讨厌不停地编写代码来将东西放在表面上,所以我编写了“putStuffOnThisThing” trait,并且他们都有它。这不是继承!这种推理背后的基本错误可能是您希望将traits视为显示层次结构的不同方式,而您不应该这样做。它不能替代实际的良好设计,它是工具箱中的技巧,您可以误用它来进行多重继承,但您最好将其用作避免多次编写某些行的方法。
因此,为了辩护比较:traits与多重继承具有相同的一些问题,例如您需要解决的具有相同名称的多个事物的别名问题。虽然这不完全是钻石问题,但非常接近。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接