【问题标题】:How to implement interface members explicitly using JAVA?如何使用 JAVA 显式实现接口成员?
【发布时间】:2017-05-11 11:16:31
【问题描述】:

我有一个场景,我们曾经使用 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;
}

【问题讨论】:

  • 在java中的interface方法被自动定义为public,因为你不能降低继承时的可见性,你需要将它们定义为公共的,同时实现接口,以及(public String Data()throws Exception{...} )
  • explicit implementation 是什么意思? @KevinEsche 是对的,界面始终公开 (related QA)。
  • 有没有可能降低继承成员的知名度?
  • @user2810266,改用abstract class 怎么样?虽然它解决了应该是公开的问题,但它会阻碍你在实现类上做extends..设计决策..

标签: java c#


【解决方案1】:

接口只是为了向其他类公开公共功能。您使用接口来允许代码外部的人员与您的代码进行交互。为此,您需要将方法定义为公开的。

如果您想强制某人重写一组给定的私有方法,您可能需要声明一个包含一系列抽象受保护方法的抽象类。

【讨论】:

    【解决方案2】:

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

    给定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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-13
      • 1970-01-01
      • 2021-09-03
      • 2013-08-19
      相关资源
      最近更新 更多