今天碰到學弟小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 的定義如下:

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 ,同時讓 ChildNewUtil 都 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 的 method1method2,而且也可以透過 AbstractUtil 來作 Polymorphism,這樣不就是做出一個「假的多重繼承」(Fake Multiple Inheritance) 了嗎?

 

歷史上的今天