2012-03-28 4 views
3

明示的なインターフェイス実装を使用して、インターフェイス実装クラスのプロパティタイプを変更しようとしています。Explicit Interface Implementationを使用しています

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年代を処理するための実装を持っているでしょう - より良い解決策はvisitorパターンを使用するのが良いかもしれない

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

:あなたがする必要があります。

+0

'SomeClass1'は' ISample'の型ではなく、 'ISample'が' SampleA'の場合に最初に例外を投げます。 – ntziolis

+0

次に制約を使用します。物事が公開されていると仮定すると、彼のコードは公開されていないことを示しています。 – payo

+1

ntziolisの型チェックをいくつか追加しました。私は安全なルートを示していませんでした。オブジェクトをキャストする方法を示していました。明らかに、コードをより信頼できるものにするために、いくつかのデザインを追加する必要があります。 – payo

関連する問題