【问题标题】:When you implement an interface in Java is it explicit or implicit?当你在 Java 中实现一个接口时,它是显式的还是隐式的?
【发布时间】:2010-03-02 09:15:13
【问题描述】:

我刚刚开始弄清楚 .Net 中隐式和显式接口实现之间的区别。由于我来自 Java 背景,这个想法仍然有点令人困惑。我希望知道哪个 Java 会更明显地看出区别是什么。我假设 Java 是显式的???

【问题讨论】:

    标签: java .net interface


    【解决方案1】:

    不,Java 是隐式的。显式是指您要实现多个接口,这些接口中具有相同的方法签名,并且您明确声明该实现适用于哪个接口。

    来自 MSDN 的示例:

    public class SampleClass : IControl, ISurface
    {
        void IControl.Paint()
        {
            System.Console.WriteLine("IControl.Paint");
        }
        void ISurface.Paint()
        {
            System.Console.WriteLine("ISurface.Paint");
        }
    }
    

    这里我们有两个Paint() 方法,每个接口一个。在 Java 中,您只能有 一个 Paint() 实现。在 C# 中,您可以选择为每个接口实现版本,因此您可以根据类的调用方式获得不同的行为。

    所以如果我打电话:

    SampleClass c = new SampleClass();
    ((IControl)c).Paint();
    ((ISurface)c).Paint();
    

    我会打印出“IControl.Paint”,然后打印出“ISurface.Paint”。

    【讨论】:

    • 好吧,我想这是有道理的。在 Java 中,我只需要创建一个新接口来解决这个问题。
    • 那么可能是另一个问题。我正在尝试创建 IDictionary(Of TKey, TValue) 的实现。你是说我应该显式地实现所有的 IDictionary 而隐式地实现来自 ICollection 和 IEnumerable 的其他 IDictionary?
    • 一般来说答案是否定的,除非你真的需要对不同的界面有不同的行为(并且最好也有一个该死的好)我会避免使用显式风格。 IDictionary 已经扩展了 ICollection 和 IEnumerable,因此您不需要单独实现这些,只需实现 IDictionary。
    【解决方案2】:

    在 Java 中没有显式和隐式的区别。如果您有两个接口都声明了一个具有相同签名的方法,并且一个类实现了这两个接口,那么具有正确签名的类中的一个方法实现了两个接口中的方法。

    【讨论】:

    • 好的。然后你不能转换到任何一个接口并使用该方法的特定版本。你的版本是唯一的版本,同时满足两个接口?
    猜你喜欢
    • 1970-01-01
    • 2010-10-09
    • 1970-01-01
    • 2012-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多