用 Mixin 設計模式來作多重繼承

今天碰到學弟小x 問我一個問題,他正在用 Java 開發,偏偏剛好想要繼承(extends)兩個 Java 內建的 class,原本 Java 的設計就是只能 extends 一個 class,若要作 multiple inheritance,就只能夠利用 implements 多個 interface 來作,但難道真的沒有方法解決嗎?

一聽到這個問題,我馬上就想到 Mixin 這個設計模式(Design Pattern),Wikipedia 上的解釋有點弱,它的概念大概是這樣的:

Mixin Pattern
Figure: Mixin Pattern

從上圖看起來,就是把其它沒有繼承 class 的 methods 「包起來」 mix-in 到 target class。這樣就「好像」(因為本來就不是真正的)有一點點繼承的感覺,用 Java 的程式碼來舉個例說明。

假設 parent class 的定義如下:
[code lang="java"]
class Parent {
public void foo();
}
[/code]
然後有一個 class 繼承 Parent 這個 class:
[code lang="java"]
class Child extends Parent {
...
}
[/code]
這時我們可能想要讓 Child 「再繼承」某個 Util class
[code lang="java"]
class Util {
public int method1(int p1, String p2) { .... }
public String method2(boolean q1, int q2) { .... }
}
[/code]
但是 Java 就設計了不能 extends 兩個以上的 class ,所以我們可以這樣作,改一下 Child 這個 class,並且建一個新的 NewUtil class 繼承 Util ,同時讓 ChildNewUtil 都 implements 同樣的 AbstractUtil interface 來維持 polymorphism 的效果:
[code lang="java"]
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);
}
}
[/code]
這樣一來,Child class 的 instance 不但可以使用 Util class 的 method1method2,而且也可以透過 AbstractUtil 來作 Polymorphism,這樣不就是做出一個「假的多重繼承」(Fake Multiple Inheritance) 了嗎?

  • CA

    但是這樣是不是沒有辦法製作 virtual inherit
    例如
    class human{
    int hp ;
    } ;

    class mage : virtual public human{
    } ;

    class warrior : virtual public human{
    } ;

    class magicSworder : public mage , public warrior {
    } ;
    會產生兩條HP @ @

  • XD 這樣太惡搞了啦

  • 不错的文章,学习了