18

C# では、同じメソッド (F() など) を持つ 2 つの基本インターフェイスがある場合、明示的な実装を使用して異なる impl を実行できます。F() の場合。これにより、現在の視点に応じて、IMyInterface1 または IMyInterface2 としてオブジェクトを別の方法で処理できます。これはJavaで可能ですか?

4

4 に答える 4

31

いいえ、Java での C# の明示的なインターフェイスの実装に勝るものはありません。

プラス面としては、Java には共変の戻り値の型があるため、インターフェイスが指定するよりも厳密に型指定された実装を提供したい場合でも問題ありません。たとえば、これは問題ありません。

interface Foo
{
    Object getBar();
}

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

C#はそれを許可しません(共変の戻り値の型をサポートするようになったC#9より前)-そしてそれを回避する方法の1つは、通常、インターフェースを明示的に実装してから、より具体的なパブリックメソッド(通常はインターフェース実装によって呼び出されます)を持つことです。 .

于 2009-02-21T19:45:45.580 に答える
4

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();
    }
}
于 2012-09-28T15:15:43.213 に答える
0

メソッドがオーバーロードされている場合にのみ、これを行うことができます。異なることを行うと予想される 2 つのメソッドがある場合、IMHO には異なる名前を付ける必要があります。

于 2009-02-21T19:54:04.780 に答える
-17

いいえ、Javaには存在しないはずです。良いデザインに悩まされない人に投げかけるのは、もう一つの骨です。

インターフェイスの明示的な実装は、決して必要とされたり使用されたりしてはなりません。これが解決しようとする問題を解決するためのより良い方法があります。

于 2010-05-21T04:20:52.460 に答える