【问题标题】:Is the C# "explicit implementation" of the interface present in Java?Java中是否存在接口的C#“显式实现”?
【发布时间】:2010-10-09 02:04:35
【问题描述】:

在 C# 中,如果您有两个具有相同方法的基本接口(例如 F()),您可以使用显式实现来执行不同的 impl。对于 F()。这使您可以区别对待对象,对应于当前的观点:作为 IMyInterface1 或 IMyInterface2。这在 Java 中可行吗?

【问题讨论】:

    标签: c# java explicit-implementation


    【解决方案1】:

    不,没有什么能比得上 C# 在 Java 中的显式接口实现。

    从好的方面来说,Java 具有协变返回类型,因此如果您想提供比接口指定的类型更强的实现,那没关系。例如,这很好:

    interface Foo
    {
        Object getBar();
    }
    
    public class Test implements Foo
    {
        @Override
        public String getBar()
        {
            return "hi";
        }
    }
    

    C# 不允许这样做(在 C# 9 之前,now supports covariant return types) - 解决它的一种方法通常是显式实现接口,然后使用更具体的公共方法(通常由接口实现调用)。

    【讨论】:

    • P.S. - “C# 不允许那样”不再是这种情况,C# 9.0 支持协变返回类型 :)
    • @Kir_Antipov:是的,12 年前的答案通常会过时 :)
    • 是的,我知道 xD 相反,Java-部分答案仍然有效,所以我认为值得一提的是,至少有一种语言实际上正在开发中:)跨度>
    【解决方案2】:

    使用Java中匿名接口实现的机制也可以达到类似的效果。

    查看示例:

    interface Foo {
    
        void f();
    }
    
    interface Bar {
    
        void f();
    }
    
    public class Test {
    
        private String foo = "foo", bar = "bar";
    
        Foo getFoo() {
            return new Foo() {
    
                @Override
                public void f() {
                    System.out.println(foo);
                }
            };
        }
    
        Bar getBar() {
            return new Bar() {
    
                @Override
                public void f() {
                    System.out.println(bar);
                }
            };
        }
    
        public static void main(String... args) {
            Test test = new Test();
            test.getFoo().f();
            test.getBar().f();
        }
    }
    

    【讨论】:

      【解决方案3】:

      不,它不应该出现在 Java 中。对于那些对优秀设计不屑一顾的人来说,这只是另一块骨头。

      永远不应需要或使用接口的显式实现。有更好的方法来解决这个试图解决的问题。

      【讨论】:

      • 您是否也认为私有继承只适用于“懒得做设计的人”?这是 Java 缺少的另一个有用的 OOP 功能。
      • 它永远不会出现在 Java 中,原因与委托永远不会出现在 Java 中的原因相同。谷歌一下。有一篇很好的文章介绍了为什么委托从未在 Java 中做过,这也是类似的。这很糟糕,因为它允许你做你可以用它做的好事。微软及其生态系统没有得到的东西。
      • @ealgestorm,您确实意识到即使是 Swing 也会“滥用”对象以使它们表现得像代表,对吧?此外,我确实觉得您的几乎所有问题都与 .NET 有关,这有点有趣。
      • @DontCare4Free 大声笑,你应该阅读一下为什么 java 是这样设计的,我认为委托是 .NET 中糟糕的设计选择之一——它会导致糟糕的设计,因为你可以和他们一起做。
      • 至于显式接口——在复杂的场景中,你可能碰巧符合两个不同系统的 API,它们恰好定义了具有匹配方法的接口,但仍然必须有不同的实现。复杂的负担显然来自消费代码。
      【解决方案4】:

      只有在方法重载时才能这样做。 如果您有两种方法可以做不同的事情,恕我直言,它们应该有不同的名称。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-03-01
        • 1970-01-01
        • 2010-10-22
        • 2012-04-27
        • 2013-06-08
        • 2019-04-07
        • 2015-04-29
        • 2010-11-03
        相关资源
        最近更新 更多