对象组合中的转发委派:特征和混合如何解决这个问题?

时间:2014-07-11 09:54:56

标签: oop

使用组合代替继承的一个缺点是组合类提供的所有方法必须在派生类中实现,即使它们只是转发方法。 寻找这个问题的解决方案,我遇到了称为Traits和mixin的东西(可用scala,Perl 6等语言提供)。然而,我还没有完全理解特质和混合背后的想法。

我的问题是traits(或Mixins)如何用组合解决委托问题?

1 个答案:

答案 0 :(得分:0)

我不是Perl或Scala程序员,但没有其他人试图回答您的问题,所以我会尝试。 traits或mixins是多重继承的替代方案。 C ++实现了多重继承,但是它存在一些问题。像Java和C#这样的连续语言决定只实现单继承。但正如你所说,单一继承可能不方便;如果要使用多个类中的方法,则必须组合这些类的实例,然后编写方法以将消息转发到组合对象。

Traits / mixins是单一遗传不便的解决方案。编程语言不是自己编写对象和编写转发方法,而是为您完成工作。如果您的对象不理解发送给它的某些消息,则运行时环境将查看所有traits / mixin以查看其中一个是否了解该消息。如果特征/ mixin理解该消息,则执行该特征的实现。这使您可以将常用功能捆绑到一个组件中,称为trait或mixin,因此您可以在很多地方使用它。

我认为traits / mixins相对于多重继承的重要优势在于,当不同的mixin实现具有相同名称的方法时,您可以预测将执行哪种方法。知道在C ++中执行哪种方法是个问题。请参阅维基百科关于"钻石问题的文章" (http://en.wikipedia.org/wiki/Multiple_inheritance#The_diamond_problem