【问题标题】:java how can I overcome multiple inheritance and diamond problamjava如何克服多重继承和钻石问题
【发布时间】:2017-05-17 12:34:28
【问题描述】:

我正在尝试了解如何克服 JAVA 中的“钻石问题” 假设我有这 3 个接口:

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

我怎样才能得到类 Delta 给我 Alpha 接口的输出? 除了改成“Delta implements Alpha”还有什么办法吗?

【问题讨论】:

  • 您无法访问已被覆盖的方法。如果您需要访问它,您需要添加一个可以调用的方法,该方法可以对该方法进行分类,例如到 Betta 或 Gamma。
  • 如果可以的话,你可以在Alpha接口中定义static方法,并从Delta类中调用。
  • 你试过编译这个吗?
  • 谢谢 Peter Lawrey 我会试试的
  • SachinSarawgi 但如果我这样做了,Betta 和 Gamma 就没用了,对吗?

标签: java interface extends implements diamond-problem


【解决方案1】:

您可以将 Alpha 的方法转为静态方法

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

或者您可以创建一个引用 Alpha 在 Betta 或 Gamma 中的方法的方法。

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

【讨论】:

    【解决方案2】:

    如果您在 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();
        }
    
    }
    

    【讨论】:

    • 我也想过,但我得到了“从 Betta 方法 A 打印”,当我尝试使用 Alpha.methodA(); 在 Betta 界面内我得到“从 Betta 方法 A 打印”和""从 Alpha 方法打印" @Rohit Gulati
    • 对不起,我误解了你的问题,我们无法访问它。请参考此link。我们必须将其设为静态或扩展 Alpha。
    • 替代方案:您可以在 Betta 中添加一种称为 Alpha 默认方法的默认方法。更新了上面的帖子。 @Liana
    • 非常感谢您的帮助!我现在明白了
    猜你喜欢
    • 2019-10-09
    • 2020-09-23
    • 1970-01-01
    • 2020-10-03
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 2017-07-02
    • 2011-02-09
    相关资源
    最近更新 更多