2011-04-21 5 views
3

다음과 같은 것을하려고합니다 :인터페이스에서 다른 유형으로 암시 적 변환을 작성하는 방법?

public class SomeWrapper : ISomeWrapper{ 

    public static implicit operator ActualRec(ISomeWrapper someWrapper) 
     { 
      return ((SomeWrapper)someWrapper).SomeInfo; 
     } 
} 

그러나이 코드는 실패합니다. "매개 변수 또는 반환 유형이 SomeWrapper 유형이어야합니다."

컴파일이 진술하는 문제를 이해합니다. 하지만 내 응용 프로그램을 통해 SomeWrapper 인스턴스를 저장하는 ISomeWrapper 변수를 사용하기 때문에이 형식 conversionb 필요합니다. 또한 SomeWrapper는 ISomeWrapper를 구현하는 유일한 클래스입니다.

내 구체적인 클래스에서 알고있는 형식에 ISomeWrapper 인터페이스가 있으면 암시 적 변환을 수행 할 수있는 방법이 있습니까?

편집 : 모두에 의해 암시 적으로, C#에서는 인터페이스에서의 암시 적 캐스팅이 불가능합니다.

왜 이렇게해야합니까? ActuallyRec의 메서드/속성을 호출하기 위해 ISomeWrapper 사용자에게 액세스 권한을 부여하지 않고 ActualRec을 매개 변수로 필요로하는 메서드를 호출하도록 ISomWrapper 사용자에게 (암시 적으로) 허용하려고합니다.

예를 들어, ISomeWrapper에 ActualRec 속성을 포함하면 ISomeWrapper의 사용자는 노출하고 싶지 않은 ActualRec (Say, someWrapper.ActualRec.Dispose())에서 사용할 수있는 메서드를 호출 할 수 있습니다.

그것이 암시 적 변환을 찾으려는 이유입니다.

또한, SomeWrapper를 응용 프로그램에 걸쳐 사용하고 싶지 않습니다.

이 작업을 수행하기위한 개념/패턴이 있는지 제안하십시오.

관심을 가져 주셔서 감사합니다.

+3

"SomeWrapper는 ISomeWrapper를 구현하는 유일한 클래스입니다."- "나쁜 코드 냄새가 난다"라는 큰 빨간색 깃발을 흔들고 있습니다. 인터페이스를 구현하는 클래스가 하나뿐이라면 어떤 값이 인터페이스입니까? 어디서나 수업을 사용하십시오. –

+0

@ Eric : 단위 테스트에이 인터페이스를 사용하기 때문에 무의미하지 않습니다. –

답변

6

디자인에 결함이 있다고합니다. 당신은 인터페이스에서 콘크리트 타입을 사용하고 있는데, 인터페이스를 사용하는 것이 무의미합니다. 인터페이스는 구현 유형이 필요한 일련의 서비스를 제공하기 위해 준수하는 계약입니다. 귀하의 예에서 인터페이스 (계약)에 SomeInfo 속성이 정의되어 있지 않습니까? 그렇지 않다면 왜 인터페이스를 사용하여 캐스트하려고합니까? 입력 인수 자체에 SomeWrapper을 사용해야합니다.

+0

나는 당신에 동의합니다. 디자인이 좋지 않은 것 같습니다. 제 질문 설명의 편집 섹션을 참조하십시오.이 접근 방법을 사용한 이유를 설명했습니다. –

2

C#은 다른 개발자를 현혹시킬 수있는 읽을 수없는 코드로 쉽게 이어질 수 있기 때문에 이것을 허용하지 않습니다. 대신 확장 방법을 사용하십시오 : 이것은 당신이 방식으로 규칙을 수행 할 수 있습니다

public static class SomeWrapperExtensions 
{ 
    public static ActualRec ToActualRec(
     this ISomeWrapper wrapper) 
    { 
     return ((SomeWrapper)someWrapper).SomeInfo; 
    } 
} 

그런 것하지 surprise 다른 개발자 :

ActualRec rec = wrapper.ToActualRec(); 

참고이 여전히 경우 취약하지만, 당신이 돈 때문에 ' ISomeWrapper이 실제로 SomeWrapper 구현을 나타내는 지 여부를 알 수 없습니다.

+0

값이 명확하게 대상 유형 (예 : 할당)으로 전달되거나 컨텍스트에서 사용할 수있는 암시 적 변환 형식이 있었으면합니다 (예 : 할당 또는 n 번째 매개 변수가 n 번째 매개 변수가 취할 수없는 메서드에 전달하는 경우). 다른 것). 암시 적 변환 * 인터페이스 유형과 관련된 눈부신 상황의 대부분은 이러한 변환의 존재가 명확하지 않은 과부하 선택을 초래하는 경우에서 비롯됩니다. 이러한 동작은 인터페이스에 거의 제한되지 않습니다. – supercat

6

이것은 C#에서 제한됩니다. 아래를 읽으십시오.

http://msdn.microsoft.com/en-us/library/aa664464%28VS.71%29.aspx

클래스 또는 구조체 T는 다음의 모든 해당 제공된 타겟 타입 소스 타입 S에서 전환을 선언 할 수있다 : ..

S 나 T는 객체 나 인터페이스 유형이 아닙니다.또한

,

사용자 정의 변환은 변환하거나-유형을 인터페이스 할 수 없습니다. 특히이 제한 사항은 인터페이스 유형으로 변환 할 때 사용자 정의 변환이 발생하지 않으며 변환되는 객체가 실제로 지정된 인터페이스 유형을 구현하는 경우에만 인터페이스 유형으로의 변환이 에 성공한다는 것을 보장합니다.

관련 문제