2014-07-11 38 views
0

使用合成代替繼承的一個缺點是,由組合類提供的所有方法都必須在派生類中實現,即使它們只是轉發方法。 尋找解決這個問題的方法我來到了一個名爲Traits和mixin的東西(可用像scala,Perl 6這樣的語言)。然而,我並沒有完全理解特質和mixin背後的想法。對象構成中的轉發授權:特徵和混合如何解決這個問題?

我的問題是性狀(或Mixins)如何解決委託與組成問題?

回答

0

我不是Perl或Scala程序員,但沒有人試圖回答你的問題,所以我會嘗試它。 traits或mixin是多重繼承的替代品。 C++實現了多重繼承,但是它存在一些問題。像Java和C#這樣的連續語言決定只實現單一繼承。但單一繼承可能會很不方便,就像你說的那樣;如果要使用多個類的方法,則必須組合這些類的實例,然後編寫方法將消息轉發給組合對象。

特徵/混入是解決單一繼承帶來的不便。編程語言不是自己編寫對象和編寫轉發方法,而是爲您完成工作。如果你的對象不理解一些發送給它的消息,運行時環境將查看所有traits/mixin,看看它們中的一個是否理解該消息。如果trait/mixin理解消息,那麼執行該特徵的執行。這使您可以將常用功能捆綁到一個名爲trait或mixin的組件中,因此您可以在很多地方使用它。

我認爲traits/mixins在多重繼承方面的重要優勢在於,當不同的mixin使用相同的名稱實現方法時,您可以預測將執行哪個方法。知道在C++中執行哪種方法是個問題。參見維基百科關於「鑽石問題」的文章(http://en.wikipedia.org/wiki/Multiple_inheritance#The_diamond_problem