2011-10-18 32 views
0

私のプログラムのいくつかの場所では、オブジェクト(Test)の具体的な実装にアクセスする必要があり、他の場所では読み取り専用インターフェイス(ITest)のみが必要です。これは、ユーザーがすべてのプロパティが設定され、変更可能であると仮定するのを防ぐのに役立ちます。明示的なインターフェイスの実装と複数のインターフェイス

たとえば、ユーザーがTestFactory.Searchを呼び出すと、返されたコレクションによってプロパティAが変更されずCollectionBを使用できなくなります)。私は、オブジェクトの初期化子を使用してプロパティ名を同じに保つことができるようにしたいと思います。私は次の解決策を持っています:

public interface IReadOnly 
{ 
    int Id{ get; } 
    string Name{ get; } 
} 

public class ClassA : IReadOnly 
{ 
    int Id{ get; internal set; } 
    string Name{ get; set; } 
} 

public interface ITest 
{ 
    int Id{ get; } 
    IReadOnly A { get; } 
} 

public class Test : ITest 
{ 
    private ClassA classA = new ClassA(); 

    int Id{ get; internal set; } 
    IReadOnly ITest.A{ get{ return classA; } } 
    public ClassA A 
    { 
     get 
     { 
      return classA; 
     } 
     set 
     { 
      classA = value; 
     } 
    } 

    public IEnumerable<string> CollectionB {get;set;} 
} 

public static class TestFactory 
{ 
    IEnumerable<ITest> Search(){ /**/ } 
    Test Read(){ /**/ }; 
} 

この問題を解決するには良い方法がありますか?明示的なインターフェイス実装の概念を濫用していますか?

+0

'Test'クラスは' IReadOnly'を実装し、 'testとしてIReadOnly'を使用します。' test' – sll

答えて

0

代わりに抽象クラスを作成し、フルアクセスと読み取り専用の動作をサブクラス化することはありますか?

1

私はあなたのTestクラスにIReadOnlyとITestの両方のインターフェイスを実装させてもらいました。セッターのアクセスを制限する場合は、IReadOnlyにキャストします。それ以外の場合は、ITestまたは具体的なテストを使用します。

関連する問題