2013-08-22 77 views
1

私有訪問修飾符我已經和界面如下:解決方法來強制實現的接口屬性

public interface IData 
{ 
    String Name { get; set; } 
} 

並有2類,實現它:

public class Data1 : IData 
{ 
    public String Name { get; set; } 
} 

public class Data2 : IData 
{ 
    public String Name { get; set; } 
} 

我需要防止獲得的名稱一個Data2實例。編譯器不允許以下所有形式:

internal String Name { get; set; } 
private String Name { get; set; } 
public String Name { private get; set; } 

我確實理解爲什麼這不是明確可能的邏輯原因。屬性將使用對實現的訪問修飾符沒有任何線索的接口進行訪問,如果無法找到它,將會失敗。

我的使用情況是,無論Data1Data2情況下應該能夠使用方法,其中一個IData參數用於(有些地方沒有用的Name存在的方法),但Data2是敏感的,不應該直接訪問。因此我正在尋找解決方法。

+1

可以明確地實現接口,這意味着你無法通過的情況下訪問該界面件'Data2'(你必須強制轉換爲'IData'),但由於接口是契約,它們上的所有方法在類上實現時都必須是公共的。在明確實現時不能使用訪問修飾符,但對接口類型進行強制轉換會使它們可訪問(就好像它們是公共的) – Charleh

回答

2

編譯器不允許類型實現此接口將只能訪問改變這一點,因爲你不要這樣做。你定義了一個具有公共getter和setter的接口。

public interface IData 
{ 
    String Name { get; set; } 
} 

這聽起來像你需要兩個接口:

public interface ISettableData 
{ 
    String Name { set; } 
} 

public interface IData : ISettableData 
{ 
    String Name { get; set; } 
} 

和實現:

public class Data1 : IData 
{ 
    public String Name { get; set; } 
} 

public class Data2 : ISettableData 
{ 
    public String Name { set; } 
} 
+0

這真是太棒了:)我現在可以在方法參數中使用ISettableData –

5

聽起來好像你想通過Data2的實例訪問Name是不允許的。如果是這樣的話,那麼使用顯式接口實現

public class Data2 : IData { 
    String IData.Name { 
    get { ... } 
    set { ... } 
    } 
} 

現在NameData2情況下被視爲IData

Data2 obj = new Data2(); 
string name = obj.Name; // Error! 
IData other = obj; 
name = other.Name; // Ok 
+0

不完全是我需要但有趣的知道。即使在使用界面時,也是爲了防止訪問。查看來自Cory Nelson的答案 –