2009-02-21 3 views
15

C#에서 동일한 메소드 (예 : F())를 가진 두 개의 기본 인터페이스가있는 경우 명시 적 구현을 ​​사용하여 다른 impl을 수행 할 수 있습니다. F()에 대해. 이렇게하면 현재 시점에 해당하는 개체를 다르게 처리 할 수 ​​있습니다. IMyInterface1 또는 IMyInterface2. 자바에서도 가능합니까?Java에있는 인터페이스의 C# "명시 적 구현"입니까?

답변

25

아니요, Java에서 C#의 명시 적 인터페이스 구현과 같은 것이 없습니다.

Java는 공변 (covariant) 리턴 유형을 가지고 있으므로 인터페이스가 지정하는 것보다 더 엄격하게 유형화 된 구현을 제공하려면 괜찮습니다.

interface Foo 
{ 
    Object getBar(); 
} 

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

C 번호는 것을 허용하지 않을 - 그리고 주변의 방법 중 하나는 일반적으로 인터페이스 구현이라는보다 구체적인 공개 방법 (명시 적으로 인터페이스를 구현하고 가지고 일반적으로 : 예를 들어,이 괜찮습니다).

0

메서드가 오버로드 된 경우에만이 작업을 수행 할 수 있습니다. 다른 일을 할 것으로 예상되는 두 가지 방법이있는 경우 IMHO라는 다른 이름을 사용해야합니다.

-17

아니요 Java에 표시해서는 안됩니다. 그것은 좋은 디자인으로 괴롭혀 질 수없는 사람들에게 던질 또 하나의 뼈입니다.

인터페이스의 명시 적 구현은 절대로 필요하거나 사용해서는 안됩니다. 이 문제를 해결하는 더 좋은 방법이 있습니다.

+0

당신은 또한 개인 상속은 "좋은 디자인으로 방해 할 수없는 사람들"에 대한 것을 믿습니까? 이것이 Java에서 누락 된 또 다른 유용한 OOP 기능입니다. –

+0

델리게이트가 Java에있을 수 없다는 것과 같은 이유 때문에 결코 Java에 없을 것입니다. google it. 자바로 한 번도 해본 적이없는 위임자와 비슷한 이유에 대한 좋은 기사가 있습니다. 그것은 당신이 당신이 그것을 할 수있는 좋은 것들을하지 못하게하기 때문에 나쁜 것입니다. 마이크로 소프트와 생태계가 생기지 않는 것. – eaglestorm

+1

@ealgestorm, 스윙조차도 객체를 "위임 (abuse)"객체가 위임자처럼 행동하게한다는 것을 알고 있습니까? 또한 거의 모든 질문이 .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(); 
    } 
}