C# 是“显式实现”吗? Java 中存在的接口是什么?

发布于 2024-07-13 19:40:25 字数 139 浏览 6 评论 0原文

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

In C#, if you have two base interfaces with the same method (say, F()) you can use explicit implementation to perform different impl. for F(). This alloes you to differently treat the object, corresponding to the current point of view: as IMyInterface1 or IMyInterface2. Is this possible in Java?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

莫多说 2024-07-20 19:40:26

不,没有什么比 Java 中 C# 的显式接口实现更好的了。

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

interface Foo
{
    Object getBar();
}

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

C# 不允许这样做(在 C# 9 之前,现在支持协变返回类型) - 解决方法之一通常是显式实现接口,然后有一个更具体的公共方法(通常称为通过接口实现)。

No, there's nothing like C#'s explicit interface implementation in Java.

On the plus side, Java has covariant return types, so if you want to provide a more strongly typed implementation than the interface specifies, that's okay. For instance, this is fine:

interface Foo
{
    Object getBar();
}

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

C# wouldn't allow that (prior to C# 9, which now supports covariant return types) - and one of the ways around it is typically to implement the interface explicitly and then have a more specific public method (usually called by the interface implementation).

流绪微梦 2024-07-20 19:40:26

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

You can achieve similar effect using the mechanism of anonymous interface implementation in Java.

See example:

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();
    }
}
一城柳絮吹成雪 2024-07-20 19:40:26

仅当方法重载时才可以执行此操作。
如果您有两个预计执行不同操作的方法,那么它们应该具有不同的名称,恕我直言。

You can only do this if the methods are overloaded.
If you have two method which are expected to do different things, they should have different names IMHO.

假扮的天使 2024-07-20 19:40:26

不,它永远不应该出现在 Java 中。 对于那些不关心好的设计的人来说,这只是又一根骨头。

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

No and it should never be present in Java. It's just another bone to throw at people who can't be bothered with good design.

Explicit implementation of an interface should never be needed or used. There are better ways to solver the problem that this tries to solve.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文