2011-10-18 146 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 as IReadOnly'' test'' – sll

回答

0

也許創建一個抽象類,然後子類的完整訪問和只讀行爲?

1

我會讓你的Test類實現接口,IReadOnly和ITest。當你想限制setter訪問權限時,轉換爲IReadOnly,否則使用ITest或具體的Test。