今天碰到學弟小x 問我一個問題,他正在用 Java 開發,偏偏剛好想要繼承(extends)兩個 Java 內建的 class,原本 Java 的設計就是只能 extends 一個 class,若要作 multiple inheritance,就只能夠利用 implements 多個 interface 來作,但難道真的沒有方法解決嗎?
一聽到這個問題,我馬上就想到 Mixin 這個設計模式(Design Pattern),Wikipedia 上的解釋有點弱,它的概念大概是這樣的:
從上圖看起來,就是把其它沒有繼承 class 的 methods 「包起來」 mix-in 到 target class。這樣就「好像」(因為本來就不是真正的)有一點點繼承的感覺,用 Java 的程式碼來舉個例說明。
假設 parent class 的定義如下:
class Parent { public void foo(); }
然後有一個 class 繼承 Parent 這個 class:
class Child extends Parent { ... }
這時我們可能想要讓 Child 「再繼承」某個 Util class
class Util { public int method1(int p1, String p2) { .... } public String method2(boolean q1, int q2) { .... } }
但是 Java 就設計了不能 extends 兩個以上的 class ,所以我們可以這樣作,改一下 Child 這個 class,並且建一個新的 NewUtil class 繼承 Util ,同時讓 Child 跟 NewUtil 都 implements 同樣的 AbstractUtil interface 來維持 polymorphism 的效果:
interface AbstractUtil { public int method1(int p1, String p2); public String method2(boolean q1, int q2); } class NewUtil extends Util implements AbstractUtil { ... } class Child extends Parent implements AbstractUtil { private NewUtil utilInstance = null; public Child() { utilInstance = new NewUtil(); } public int method1(int p1, String p2) { return utilInstance.method1(p1, p2); } public String method2(boolean q1, int q2) { return utilInstance.method2(q1, q2); } }
這樣一來,Child class 的 instance 不但可以使用 Util class 的 method1 和 method2,而且也可以透過 AbstractUtil 來作 Polymorphism,這樣不就是做出一個「假的多重繼承」(Fake Multiple Inheritance) 了嗎?
歷史上的今天
- 您還在使用IE6嗎? - 2009
- HTC Magic (G2) firmware 搶鮮玩 - 2009
- HTC Magic (Android) 手機由中華電信代理銷售有譜? - 2009




但是這樣是不是沒有辦法製作 virtual inherit
例如
class human{
int hp ;
} ;
class mage : virtual public human{
} ;
class warrior : virtual public human{
} ;
class magicSworder : public mage , public warrior {
} ;
會產生兩條HP @ @
XD 這樣太惡搞了啦
不错的文章,学习了