2017-01-03 62 views
2

我想了解我是如何克服“钻石问题”,在JAVA 让我们说我有这3个接口:的java我怎样才能克服多重继承和钻石problam

interface Alpha{ 
    public default int methodA() { 
     int result=0; 
     System.out.println("Print from Alpha methodA"); 
     return result+4; 
    } 
} 

//********************************** 

interface Betta extends Alpha { 
    public default int methodA() { 
     int result=0; 
     System.out.println("Print from Betta methodA"); 
     return result+8; 
    } 
} 
//******************************* 

interface Gamma extends Alpha { 
    public default int methodA() { 
     int result=0; 
     System.out.println("Print from Gamma methodA"); 
     return result+16; 
    } 
} 

而那类:

public class Delta implements Betta,Gamma { 
    public static void main(String args[]) { 
    // TODO Auto-generated method stub 

    Delta cObj=new Delta(); 
    cObj.methodA(); 
} 

我怎么能得到班级给我的Alpha接口输出? 除了将它改为“Delta实现Alpha”以外的其他方法?

+3

您无法访问已被覆盖的方法。如果您需要访问它,您需要添加一个可以调用此方法的方法,例如Betta或Gamma。 –

+1

如果没问题,那么你可以在Alpha界面中定义'static'方法,并从Delta类中调用它。 – SachinSarawgi

+0

你试过编译过吗? –

回答

0

如果您在类Delta中实现Betta和Gamma,那么您必须在Delta中获得编译错误以覆盖默认方法。因为如果两个接口具有相同的默认方法,那么实现两者的类必须定义它自己的实现。

你可以不喜欢它:

public class Delta implements Betta, Gamma { 
    public static void main(String[] args) { 
     Delta cObj = new Delta(); 
     cObj.methodA(); 
    } 

    @Override 
    public int methodA() { 
     return Betta.super.callSuperMethodA(); 
    } 
} 

public interface Betta extends Alpha { 

    public default int methodA() { 
     int result = 0; 
     System.out.println("Print from Betta methodA"); 
     return result + 8; 
    } 

    //Call this from Delta default method 
    public default int callSuperMethodA() { 
     return Alpha.super.methodA(); 
    } 

} 
+0

我也想过它,但我得到“”打印从Betta methodA“当我尝试使用Alpha.methodA();在Betta界面中,我同时获得“从Betta methodA打印”和“”从Alpha methodA打印“@Rohit Gulati – Liana

+0

对不起mybad,我误解了你的问题,我们无法访问它。请参阅此[链接](http://stackoverflow.com/a/24280376/5803493)。 我们必须将其设置为静态或扩展Alpha。 –

+0

选择:您可以在Betta中添加一个默认方法,您可以调用Alpha默认方法。更新上面的帖子。 @Liana –

0

您可以把阿尔法的方法静态

public interface Alpha { 
public static int methodA(){ 
    int result = 0; 
    System.out.println("Print from Alpha methodA"); 
    return result+4; 
}} 

,或者可以创建指阿尔法在贝塔或伽玛方法的方法。

第三个可选的解决方案是删除Gamma和Betta的默认实现,意味着将它们全部清空。