2012-08-07 1 views
6

ChannelFactory를 통해 생성 된 WCF 채널은 ICommunicationObject를 구현하지만 프록시를 ICommunicationObject에 캐스트하지 않는 한 Close() 메서드를 노출하지 않는 방법은 무엇입니까? 말이 돼?메서드가 보이지 않으면 WCF 프록시가 ICommunicationObject를 어떻게 구현합니까?

나는 오늘 집으로 오는 길에 그것에 대해 생각해 내 머리 속에서 알아낼 수 없었습니다. 어쩌면 내가 잘못된 질문을하고있을거야? 아마 내가 바보 같은 질문을하고있을거야? :)

닌자 트릭 일종인가요?

답변

5

Explicit Interface Implementation을 통해 이루어집니다. 당신이 인터페이스 멤버 캐스팅을 필요로 명시 적으로을 구현할 수

public class Bar : IFoo 
{ 
    public void Foo() {} // Implicit interface implementation 
} 

을 다른 방법 : 당신은 일반적으로이를 구현할 수

public interface IFoo 
{ 
    void Foo(); 
} 

:

당신이 인터페이스를 가지고과 같이 가정 해 봅시다 :

public class Baz : IFoo 
{ 
    void IFoo.Foo() {} // This will require casting the object to IFoo to call 
} 

Th 시간에 매우 유용 할 수 있습니다. 예를 들어, 선호하는 API가 .Close()을 호출하는 클래스에서 IDisposable을 구현하는 경우가 종종 있습니다. IDisposable을 명시 적으로 구현하면 Dispose() 메서드를 "숨김"하지만 using 문을 통해 클래스 인스턴스를 계속 사용할 수 있습니다.

+0

감사합니다, 리드와 Dan :

다음
internal interface IExample { void DoSomething(); } class ImplicitExample : IExample { public void DoSomething() { // ... } } class ExplicitExample : IExample { void IExample.DoSomething() { // ... } } class Consumer { void Demo() { var explicitExample = new ExplicitExample(); // explicitExample.DoSomething(); <-- won't compile ((IExample)explicitExample).DoSomething(); // <-- compiles var implicitExample = new ImplicitExample(); implicitExample.DoSomething(); // <-- compiles } } 

이 주제에 대한 MSDN의 기사에 대한 링크입니다 예를 들면 : 명시 적 인터페이스 구현과 암시 적 인터페이스 구현의 차이를 보여주는입니다! 첫 번째 우승. –