2009-02-21 12 views
15

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

答えて

25

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

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

interface Foo 
{ 
    Object getBar(); 
} 

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

C#がそれを許可しないだろう - と、それを回避する方法の一つは、明示的にインタフェースを実装して、(通常はインターフェースの実装によって呼び出され、より具体的なパブリックメソッドを持つことが一般的です)。

0

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

-17

いいえ、Javaには存在しないでください。それは良いデザインで悩まされない人々に投げ込むもう一つの骨です。

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

+0

あなたはまた、民間の継承のみ「良いデザインを気にすることはできません人」のためであると信じていますか?これは、Javaから欠けているもう1つの有用なOOP機能です。 –

+0

デリゲートが決してJavaになれないという同じ理由から、Javaには決してなりません。なぜデリゲートがJavaで行なわれたことがないのか、そしてこれは似ている理由についての良い記事があります。それは、それがあなたがそれでやることができる良いものではないことができるので、悪いことです。何かMicrosoftとそれが生態系は得られない。 – eaglestorm

+1

@ealgestorm、スイングでさえ、オブジェクトを「濫用して」オブジェクトをデリゲートのように振る舞わせることを理解していますよね?また、ほとんどすべての質問が.NETに関連していると面白いと思います。 –

3

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(); 
    } 
} 
関連する問題