interface的多继承?

    技术2022-05-11  93

    java是没有多继承的,只能通过接口的方式来实现这个功能。这点大家也都知道。今天看到一个interface写法很怪异,想了半天没想明白。开始还以为是自己太久没看java生疏了,问别人居然也不懂,上网一查才看到这样的写法:

    认为正确使用物件导向技术中之「多重继承」观念﹐应该如下面的例子: 假设有一个木造门﹐则: 1. 此木造门是门的一种(a kind of)。 2. 但门不是木造门的一部份(a part of)。 3. 木造门是木制品的一种。 4. 但木制品不是木造门的一部份。 5. 木制品不是门的一种。 6. 门也不是木制品的一种。 所以您可以发现﹐多重继承在使用时﹐必须非常小心﹐而且在许多时候﹐其实我们并不需要多重继承的。 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(); }}


    最新回复(0)