介面只宣告行為的外觀而不牽涉細節,細節在類之中個別實現。舉例而言,如果有兩個不具共同父祖類別的類,假設為 A, B 類,但具有一個共同的行為、一段相同的程式。 C++ 的作法是將此共同行為 - 亦即這一段相同的程式 - 設計為一個類,假設為 C 類,再令 A, B 類多重繼承 C 類;只要 C 類之中沒有任何屬性與 A, B 類之父祖相同,就不會導致鑽石繼承,同時達成程式碼再用之目的。Java 的作法則有兩個方式,其一是介面,其二是深度繼承。
介面的設計方式是以介面宣告 A,B 類具有共同行為 c ,接著在 A, B 類之中分別實現 c 的細節。具體而言,先在 A 類寫出 c 的程式碼,然後再把這一段程式碼複製到 B 類。「複製」就是介面宣告的最大缺點。介面只宣告外觀而無細節,所以它不能再用程式碼。如果我們有許多類別皆具有此共同行為,我們就要將同一段程式碼複製許多份。熟悉 XP/Agile methods 的程序員此時一定會大叫 DRY! (Don't Repeat Yourself)。程式碼的剪貼複製絕對是滋養 bug 的溫床。假設我們日後發現這段程式碼有一個 bug ,我們當然要修正。但若它已經為了實現介面內容而被剪貼複製到許多類別之中,修正它就是個大麻煩。誰知道它被複製到多少類別中了?
深度繼承的設計方式就是設法拉關係。一樣先將共同行為設計為一個類, C 類。接著從 A,B 的父祖輩中拉關係,將 C 類加入 A, B 的繼承樹中,亦即令 C 成為 A, B 的父祖之一。在單一繼承機制下拉關係動作非常麻煩,可能要翻出祖譜來上找十八代才找得到關係。如果我們要查看 A,B 類之共同行為 c 的實作內容,我們可能要上溯十八個父祖類才能在第十八代祖宗的 C 類之中找到行為 c 的內容。