2011-03-24 23 views
0

下面我有一個班,我已經提取的所有屬性的接口,但我似乎不能夠提取它......顯然創建一個新的對象像C#:提取到一個接口裏面有另一個類的類 - 或者有更好的方法嗎?

ITestItem item = new TestItem(); 

不給我訪問屬於Meta類實例的屬性。

我也想阻止任何人在TestItem之外創建一個Meta類的實例......我試圖將它標記爲內部,但是那樣會允許我,因爲屬性是公共的。

另外我不確定我是否需要有一個META接口?

這是我的課...任何人都可以幫忙嗎?

public class TestItem : ITestItem 
{ 
    public bool Enabled { get; set; } 

    public Meta Properties = new Meta(); 

    public List<int> Items { get; set; } 

    public class Meta 
    { 
     internal Meta 
     { 
     } 
     public string Name { get; set; } 
    } 

    public TestItem() 
    { 
     this.Items = new List<int>(); 
    } 
} 

EDIT 我已uppdated上述類以包括用於元的內部構造,因此它不能在類外被實例化。

這裏是我的界面我有(由頭暈的建議)......現在說,它沒有實現屬性

public interface ITestItem 
{ 
    bool Enabled { get; set; } 

    Meta Properties { get; set; }; 

    List<int> Items { get; set; } 
} 
+0

你要求在你的界面中有一個屬性,但實現一個字段。我更新了我的答案。 – gideon 2011-03-24 11:32:29

回答

2

所以,你會:

  1. 不希望也許使用術語提取進行接口,也許你對接口的想法有點不對。你想在這裏做一些閱讀。

  2. 定義Test類中的Meta類。根據您要創建實例的位置標記構造函數internalprivate

  3. 作出這樣的公開Test類外的元類的屬性

    public class TestItem : ITestItem 
    { 
        public TestItem() 
        { 
        this.Properties = new Meta();//set it from here 
        this.Items = new List<int>(); 
        } 
    
        public bool Enabled { get; set; } 
    
        //make it private set if you don't want an outsider setting it 
        public Meta Properties {get;private set} 
    
        public List<int> Items { get; set; } 
    
    
        public class Meta 
        {//make it private if you only create an instance here. 
        internal Meta(){} 
        public string Name { get; set; } 
        } 
    } 
    

您還Meta屬性添加到您的接口:

public interface ITestItem 
{ 
bool Enabled { get;set;} 
Meta Properties { get;set;} 
List<int> Items { get;set;} 
void ScheduleItem(); 
} 
+0

使用元和元。 1作爲一個類,另一個作爲屬性名稱是很好的做法????? – Martin 2011-03-24 10:05:06

+0

呃不會打破編譯,因爲你不能公開私人類作爲公共財產? @Martin你應該爲你的Meta類添加一個內部構造函數來防止外部類構造它。 – Tom 2011-03-24 10:05:58

+0

將Meta標記爲Private與Internal相同,給出以下錯誤不一致的可訪問性: – Martin 2011-03-24 10:06:53

1

你可以試試這個。它在VS2010中編譯。無論如何,爲了「分離類」以允許單元測試,也爲Meta提取接口更好。請搜索並閱讀 - 「解耦課程」。

public class Meta { // Do not make this class a child class for flexibility and testing purposes. 
    public string Name { get; set; } 
} 

public class IMeta { 
    string Name { get; set; } 
} 

public class TestItem : ITestItem { 
    public TestItem() { 
     this.Meta = new Meta(); 
     this.Items = new List<int>(); 

    public bool Enabled { get; set; } 
    public IMeta Meta { get; internal set; } 
    public List<int> Items { get; set; } 
} 

public interface ITestItem { 
    bool Enabled { get; set; }   
    IMeta Meta { get;} 
    IList<int> Items { get; set; } 
} 
相關問題