2012-03-28 9 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??  
} 

Я не знаю, если это понятно, но я не могу показаться, чтобы получить более простой способ объяснить это. Есть ли способ получить доступ к свойствам SomeClass1 с помощью интерфейса ISample?

Благодаря

ответ

1

Это потому, что вы получили объект как интерфейс, так что он не знает о новом типе недвижимости класса. Вы должны были бы:

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

Лучшим решением может быть использование visitor шаблона - который будет иметь реализации для обработки различных ISample х.

+0

Второй пример не работает, так как 'SomeClass1' является типом свойства, а не типом' 'ISample'', а первый будет генерировать исключение, если' 'ISample'' 'SampleA' – ntziolis

+0

, тогда используйте ограничения :) и I «Предполагая, что все публично, его код показывает, что он не является публичным. – payo

+1

Я добавил некоторые проверки типа для ntziolis - я не показывал безопасный маршрут, я показывал, как бросать объекты. Понятно, что некоторый дизайн должен быть добавлен, чтобы сделать код более надежным. – payo

Смежные вопросы