Является ли C # «явной реализацией» интерфейса, присутствующего в Java? - PullRequest
17 голосов
/ 21 февраля 2009

В C #, если у вас есть два базовых интерфейса с одним и тем же методом (скажем, F ()), вы можете использовать явную реализацию для выполнения различных impl. для F (). Это позволяет вам по-разному трактовать объект, соответствующий текущей точке зрения: как IMyInterface1 или IMyInterface2. Возможно ли это на Java?

Ответы [ 4 ]

28 голосов
/ 21 февраля 2009

Нет, нет ничего похожего на явную реализацию интерфейса C # в Java.

С другой стороны, у Java есть ковариантные возвращаемые типы, поэтому, если вы хотите обеспечить более строго типизированную реализацию, чем указано в интерфейсе, это нормально. Например, это нормально:

interface Foo
{
    Object getBar();
}

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

C # не допустит этого - и один из способов, как это обычно делается, заключается в явной реализации интерфейса, а затем в более конкретном открытом методе (обычно вызываемом реализацией интерфейса).

4 голосов
/ 28 сентября 2012

Вы можете добиться аналогичного эффекта, используя механизм реализации анонимного интерфейса в 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();
    }
}
0 голосов
/ 21 мая 2010

Нет, и он никогда не должен присутствовать в Java. Это просто еще одна кость, которую можно бросить людям, которые не могут быть обеспокоены хорошим дизайном.

Явная реализация интерфейса никогда не должна использоваться или использоваться. Есть лучшие способы решить проблему, которую пытается решить.

0 голосов
/ 21 февраля 2009

Вы можете сделать это только если методы перегружены. Если у вас есть два метода, которые должны делать разные вещи, они должны иметь разные имена ИМХО.

...