1. 程式人生 > >java的"多重繼承":interface模擬

java的"多重繼承":interface模擬

java的多重繼承~interface模擬
 

interface與多重繼承的觀念
不管是Java的interface或是C++的多重繼承﹐在物件導向的理論裡﹐都算是蠻新穎的概念。所以這裡我們談的﹐是以程式語言的角度﹐看看Java interface的所有意義與功能﹐是否C++的多重繼承能全部詮釋?或是相反地以Java的來詮釋C++的。

首先讓我們來複習一下什麼是C++的多重繼承。「繼承」通常在物件導向程式語言中﹐扮演著程式碼的重複利用的重責大任﹐而C++的多重繼承則讓某一個子類別可以繼承許多分屬於不同資料型別的父類別如下:

#include <stdio.h>

class Test1 {

public:

virtual void f1() {puts("Test1::f1()"; }

virtual void g1() {puts("Test1::g1()"; }

};

class Test2 {

public:

virtual void f2() { puts("Test2::f2()"; }

virtual void g2() { puts("Test2::g2()"; }

};

class Test3 : public Test1, public Test2 {

public:

virtual void gg() { puts("Test3::gg()"; }

};

void main() {

Test3 t3; t3.f1(); t3.f2();

t3.g1(); t3.g2(); t3.gg();

}

// 程式輸出:

Test1::f1() Test2::f2() Test1::g1()

Test2::g2() Test3::gg()
 
Java也提供繼承機制﹐但還另外提供一個叫interface的概念。由於Java的繼承機制只能提供單一繼承(就是隻能繼承一種父類別)﹐所以就以Java的interface來代替C++的多重繼承。interface就是一種介面﹐規定欲溝通的兩物件﹐其通訊該有的規範有哪些。如以Java程式語言的角度來看﹐Java的interface則表示:一些函式或資料成員﹐為另一些屬於不同類別的物件所需共同擁有﹐則將這些函式與資料成員﹐定義在一個interface中﹐然後讓所有不同類別的Java物件可以共同操作使用之。

所以﹐對於Java的繼承與interface﹐我們總結如下:

1.Java的class只能繼承一個父類別(用extends關鍵字)﹐但可以擁有(或稱實作)許多interface(用implements關鍵字)。

2.Java的interface可以繼承許多別的interface(也是用extends關鍵字)﹐但不可以實作任何interface。

因此﹐我們可以利用Java的interface來模擬C++的多重繼承。如上面的例子可以轉化如下:

interface Test1 {

public void f1();

public void g1();

}

interface Test2 {

public void f2();

public void g2();

}

interface Test3 extends Test1, Test2 {

public void gg();

}

class CTest implements Test3 {

public void f1() { System.out.println("Test1::f1()"; }

public void g1() { System.out.println("Test1::g1()"; }

public void f2() { System.out.println("Test2::f2()"; }

public void g2() { System.out.println("Test2::g2()"; }

public void gg() { System.out.println("Test3::gg()"; }

}

class Run {

public void run() {

CTest ct=new CTest(); ct.f1();ct.f2();

ct.g1();ct.g2(); ct.gg();

}}

class Main {

public static void main (String args[]) {

Run rr=new Run();

rr.run();

}}

// 程式輸出:

Test1::f1() Test2::f2() Test1::g1()

Test2::g2() Test3::gg()