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()