From Gossip@caterpillar

Java Gossip: 介面與多重繼承

在很多時候,又常會聽別人說,介面(interface)可以達到多重繼承的效果,這是怎麼回事?

其實要討論這個問題,首先您對於C++中多重繼承要先有認識,新手看了書說介面可以達到多重繼承,切莫人云亦云,尤其是沒有學過C++的新手們,如果您對 於C++多重繼承想要有所認識,請先看看 多 重繼承(一)多 重繼承(二)

Java不能多重繼承,但為何說Java中可以使用介面(interface)來達到多重繼承的效果,首先效果之一,就如 多 重繼承(二) 中描述的「 多重繼承時通常其中一個基底類別作為private實作體,而其它的用以表現完全的抽象介面。」,在Java中這個效果可以使用介面來達到,介面此時所扮 演的即 多 重繼承(二) 中的抽象類別,一個完全的抽象介面,這個效果的達成方式,如 介 面(interface)型態 中所介紹的,您可以直接對應這兩個主題中的程式實作來瞭解,瞭解Java中如何使用介面(interface)來達到C++中所謂多重繼承的「一種」效 果。

來看看另一個情況。

如果有SomeClass類別與OtherClass類別,您想要SomeAndOther類別可以同時擁有SomeClass類別與 OtherClass類別中已定義好的操作,並可以進行多型操作,在C++中可以用多重繼承來達到,但在Java中顯然的無法使用多重繼承,怎麼辦?您可 以在設計上先繞個彎,先使用兩個介面分別定義好SomeClass與OtherClass兩個類別的公開方法,例如:

  • ISome.java
public interface ISome {
    public void doSome();
}

  • IOther.java
public interface IOther {
    public void doOther();
}

接著讓Some與Other類別分別實作兩個介面:
  • Some.java
public class Some implements ISome {
    public void doSome() {
        ....
    }
}

  • Other.java
public class Other implements IOther {
    public void doOther() {
        ....
    }
}


SomeAndOther如何同時擁有兩個Some與Other類別已定義好的操作?並可以多型操作?SomeAndOther可以 繼承其中之一,並擁有其中之一,例如:
  • SomeAndOther.java
public class SomeAndOther extends Some implements IOther {
    private IOther other = new Other();

    public void doOther() {
        other.doOther();
    }
}

雖不滿意,但至少解決了目前的問題,當然這邊只是其中一例,畢竟C++是C++,Java是Java,兩者語法並不是一對一的關係,視實際需求還可以變化 一下。