Eiffel和C++都提供了多繼續的機制。但java卻沒有,因為它認為多繼續會導致許多問題的出現。不過Java提供了接口(interface)作為一種替換機制,它類似于Objective C中的協議(PRotocol)。Sun宣稱接口可以提供多繼續所能提供的所有特性。 Sun所宣稱的“多繼續會帶來許多的問題”這個觀點是對的,尤其是在C++中用以實現多繼續的方法更能說明這一點。那些看起來似乎使用多繼續會比單繼續更簡單的理由,現在都以被證實是毫無意義。例如,如何制訂對于從兩個類之上繼續得到的具有相同名字的數據項之間的策略?它們之間是否兼容?假如是的話,那他們是否應該被合并成為一個實體?假如不兼容,那應該如何區分它們?……這樣的列表可以列出很長很長。 Java的接口機制也可以用以實現多繼續,但它也有一個很重要的不同之處(與C++相比):繼續中的接口必須是抽象的。由于使用接口并沒有任何的實作,這就消除了需要從不同實作之間選擇的可能。Java答應在接口中聲明具有常數字段。當需要多繼續時,他們就合并成為一個實體,這樣也就不會導致歧義的產生。但是,當這些常數具有不同的值時,又有什么會發生呢? 由于Java不支持多繼續,我們就不可以像在C++和Eiffel中那樣使用混合(mixin)了。混合是一種特性,它可以把從不同的類中得到的不同的非抽象的函數放到一起形成一個新的復雜的類。例如,我們可能希望從不同的源代碼中導入一些utility函數。然而,我們也可以通過使用組合而不是繼續來達到同樣的效果,因此,這也就不會對Java構成一個重要的攻擊了。 Eiffel在解決多繼續問題時并沒有導入一個單獨的接口機制。 有些人可能認為,相對于多繼續來說,單繼續更優雅一些。這是一個很非凡的觀點。 BETA [Madsen 93]就屬于認為“多繼續不優雅”的那一種:“Beta中沒有多繼續,這主要是因為(對于多繼續)缺乏一個深刻的理論上的理解,并且當前的(對于多繼續的)建議在技術上看來也非常復雜”。他們引用了Flavors(一種可以將類混合在一起的語言)為證據。與Madsen相比,Flavors中的多繼續與其順序有關,也就是說,繼續自(A,B)和繼續自(B,A)是不一樣的。 Ada95是另一種不支持多繼續的語言。Ada95支持單繼續,并把它叫做標記類型擴展(tagged type extension)。 另外一些人認為,對于某些非凡模型下的問題,多繼續可以提供優雅的解法,因此為之付出的努力也是值得的。雖然上面所列出的關于多繼續的問題列表并不完善,它仍然顯示:與多繼續相關的問題是可以被系統地辨識出來的,而一旦問題被確認,它們也就可以被優雅地解決。當[Sakkinen 92]對于多繼續研究到達一個很深的程度后,它就得出了上述定義。 Eiffel中采用的方法是,多繼續會引發一些有趣的且有挑戰性的問題,然后再優雅地解決它們。程序員所需做的所有決定都被限制在類的繼續子句中。它包括使用renaming來保證眾多從繼續中得來的同名特性最終成為具有不同名字的特性,對于繼續而來的特性所施展的新的eXPort策略:redefining和undefining,以及用來消除歧義的select。在所有的情況下,編譯器都會為我們做好這一切,為了使得語義清楚而不管是選擇使用fork或是join,程序員都具有完全的控制權。 C++中相對Eiffel來說有著另外一種不同的用于消除歧義的機制。在Eiffel中,在renames子句中,特性間必須有著不同的名字。在C++中,可以使用域解析操作符’::’來區分成員。Eiffel的做法好處在于,歧義在聲明中就被消除掉了。Eiffel的繼續子句相對C++的來說要復雜不少,但它的代碼也顯得更簡單,更穩固,并更具彈性。這也就是聲明方法與操作符方法相比的好處所在。在C++中,每次當我們碰到在多個成員間具有歧義時,我們必須在代碼中使用域解析操作符。這經使得代碼變得混亂不堪,影響其延展性,假如有其他地方的改變會影響歧義時,我們可能就需要在歧義可能出現的每個地方改變已有的代碼。 依照[Stroustrup 94]中12.8節所說,ANSI委員會考慮過使用renaming,但是這個提議被委員會中的一個成員所阻塞掉了,他堅持讓委員會中的其他成員用兩周時間來好好地考慮這個問題。在12.8節中給出的例子顯示了在沒有顯示的renaming的前提下,如何做可以得到同樣的效果。問題在于,假如這都需要那些專家們使用兩周來考慮如何實現,那留給我們的空間又有多少呢? 域解析操作符并不只是被用來消除多繼續所帶來的歧義。由于設計良好的語言可以避免歧義的出現,因此域解析操作符也就是一個丑陋的,加深復雜性的實作手法。 在C++中,“如何來聲明多繼續中的父類們”是一個很復雜的問題。它影響到了建構函數被調用的次序,當程序員確實想從子類轉到父類時也會導致問題的出現。然而,我們也可以把這個稱為不好的程序設計風格。 C++和Eiffel的另一個不同之處在于直接的重復繼續,Eiffel中答應: class B inherit A, A end 但 class B : public A, public A { }; 卻不被C++認可。