如何使用JAVA显式实现接口成员?

时间:2016-12-27 07:06:46

标签: java c#

我有一个场景,我们过去常常使用C#中的显式实现来实现接口成员。目前我需要在JAVA中实现相同的行为,但是无法显式调用接口成员,因此将实现的成员标记为public会显示错误。我是JAVA的新手,请让我知道如何在JAVA中实现相同的行为。

C#代码:

public class WF_33470: IData
{
    private string m_data = string.Empty;
    string IData.Element
    {
        get
        {
            return m_data;
        }
    }
    string IData.Data()
    {
        get
        {
            return "Hello World";
        }
    {
}

    internal interface IData
    {
        string Element
        {
            get;
        }
        string Data();
    }

Java代码:

public class WF_33470 implements  IData
{
    private  String m_data = "";
    String getElement()throws Exception{//throws error to change the modifier to be public, but i need to achieve explicit implementation here
        return m_data;
    }
    String  Data()throws Exception{//throws error to change the modifier to be public, but i need to achieve explicit implementation here
        return "Hello World";
    }
}

interface IData
{
    String getElement()throws Exception;
    String Data()throws Exception;
}

2 个答案:

答案 0 :(得分:1)

接口仅用于将公共功能公开给其他类。您使用接口允许代码外部的人员与您的代码进行交互。为此,您需要将方法公开。

如果您想强制某人覆盖一组给定的私有方法,您可能希望使用一系列抽象保护方法声明一个抽象类。

答案 1 :(得分:0)

你无法做你目前正在做的事情,降低了方法的可见性:

给出JLS 9.1.1

  

访问修饰符public(第6.6节)适用于各种接口声明。

根据JLS 8.4.8.3

中定义的规则
  

覆盖或隐藏方法的访问修饰符(第6.6节)必须至少提供与重写或隐藏方法一样多的访问权限,如下所示:

     

如果被覆盖或隐藏的方法是公共的,那么覆盖或隐藏方法必须是公开的;否则,发生编译时错误。 [....]

正如您所看到的那样,定义interface中定义的每个方法都是隐含的public,即使没有提供访问修饰符也是如此。鉴于后面的JLS部分中的规则不可能降低给定方法的可见性,因此您在没有WF_33470修饰符的类public中定义方法的显式实现的结果当您尝试降低方法可见性时,将是编译时错误。

您需要将它们定义为

public String getElement()throws Exception{
    return m_data;
}
public String  Data()throws Exception{
    return "Hello World";
}

如果您希望知名度较低,可能需要使用abstract课程,如下所示:

public class WF_33470 extends IData {
    private String m_data = "";

    String getElement() throws Exception {
        return m_data;
    }

    String Data() throws Exception {
        return "Hello World";
    }
}

abstract class IData {
    abstract String getElement() throws Exception;

    abstract String Data() throws Exception;
}