2012-03-28 5 views
3

명시 적 인터페이스 구현을 사용하여 인터페이스 구현 클래스의 속성 유형을 변경하려고합니다.명시 적 인터페이스 구현 사용

interface ISample 
{  
    object Value { get; set; }  
} 

class SampleA : ISample 
{  
    SomeClass1 Value { get; set; } 

    object ISample.Value 
    {  
     get { return this.Value; } 
     set { this.Value = (SomeClass1)value; } 
    }  
} 


class SampleB : ISample 
{ 

    SomeClass2 Value { get; set; } 

    object ISample.Value 
    {  
     get { return this.Value; } 
     set { this.Value = (SomeClass2)value; }  
    }  
} 

class SomeClass1 
{  
    string s1;  
    string s2;  
} 

하지만 함수에서 인터페이스 obj를 전달해야 할 때 SomeClass1 또는 SomeClass2의 객체에 액세스 할 수 없습니다. 예를 들어

:

public void MethodA(ISample sample)  
{  
    string str = sample.Value.s1;//doesnt work.How can I access s1 using ISample??  
} 

이 이해할 수 있다면 나도 몰라,하지만이 설명 할 수있는 쉬운 방법을 얻을 수가 캔트. 인터페이스 ISample을 사용하여 SomeClass1의 속성에 액세스하는 방법이 있습니까?

감사

당신이 인터페이스와 객체를받은, 그래서 클래스의 새 속성 유형에 대해 알고하지 않기 때문이다

답변

1

. 다른 ISample 년대를 처리하기위한 구현을 할 것이다 -

public void MethodA(ISample sample) 
{ 
    if (sample is SampleA) 
    { 
    string str = ((SampleA)sample).Value.s1; 
    }  
} 

더 나은 솔루션이 visitor 패턴을 사용할 수 있습니다 : 당신이 필요합니다.

+0

'SomeClass1'은'ISample'의 타입이 아닌 속성의 타입이고'ISample'가'SampleA'의 경우 예외가 던져지기 때문에 – ntziolis

+0

다음에 제약 조건을 사용합니다 : 사물이 공개된다고 가정하면, 그의 코드는 그것을 공개하지 않는 것으로 보여줍니다. – payo

+1

ntziolis에 대한 몇 가지 유형 검사를 추가했습니다. 안전한 경로가 표시되지 않았으므로 객체를 캐스팅하는 방법을 보여 줬습니다. 분명히 코드를보다 신뢰성있게 만들기 위해 일부 디자인을 추가해야합니다. – payo

관련 문제