2016-09-12 21 views
0

我正在編寫一個用於財務建模的類庫。IEnumerable與具體類實現中的列表

我想定義模型使用接口來創建抽象測試,以及可能後來添加新的具體類。

我在如何定義事物列表上掙扎,所以我稍後可以添加到具體類中的列表中。

例如,如果我定義一個接口作爲我的模型被稱爲具有費用清單

IEnumerable的費用{獲得;設置;}

想要創建一個名爲ABCModel的具體類,並在其中包含具體的XYZExpense列表,那麼實現列表的最佳方式是什麼,以便我可以輕鬆地向列表中添加更多項目?

我無法將列表轉換爲IEnumerable。

因此,例如:

public interface IFinancialModel 
{ 
    IEnumerable<IExpense> Expenses { get; } 
    IEnumerable<IRevenue> Revenue { get; } 
    IEnumerable<IAsset> Assets { get; } 
    IEnumerable<ILiability> Liabilities { get; } 
} 

我需要一個叫做公共類FinancialModel具體類:IFinancialModel

,並能夠添加具體項目。

我應該創建自己的'添加'方法嗎?理想情況下,我想利用內置列表功能,而不是重新發明輪子。

+2

而不是定義他們都爲IEnumerable 的,如果你想列表功能將它們定義爲IList的。 – Kevin

+0

@Kevin正是我一直在寫...但你說這第一 –

回答

1

這取決於你實際想要做什麼。有ListIList屬性不建議,因爲你可以做任何事情(如Clear,Add等),沒有擁有類知道它。這不利於封裝。你將無法做出改變(例如設置髒標誌,改變事件或進行驗證)。

IEnumerable是一個不錯的選擇。

您可以添加setter,但不應該將通過引用設置爲屬性的值。它可以是任何東西,比如Linq查詢甚至是數據庫查詢,你都不想引用它。你只需要物品。 (還要考慮到來自外部收集的參考可以分配給其他情況下,當它改變時有,但不應該在這裏改變這將導致非常糟糕的副作用。)

// example implementation with a setter 
private List<IExpense> expenses 

public IEnumerable<IExpense> Expenses 
{ 
    get { return expenses; } 
    set { expenses = value.ToList(); } 
} 

或者您可以實施您自己的Add,AddRange,RemoveClear等方法。但是,如果主要用例是一次性設置所有項目,則只能使用SetExpenses方法,該方法與我之前展示的屬性上的setter相同。你可以考慮把它作爲一個數組在內部保存。

+0

我會給這個一展身手。完全同意你的封裝評論。 – user3637002

+0

一個問題... – user3637002

+0

如果我想添加新的項目,任何孩子名單,我需要寫一個自定義的添加方法的具體類?由於IEnumerable不公開一個Add()方法? – user3637002

0

你在找什麼是IList<T>。這是一個接口,允許您在隱藏實際列表實現的同時公開列表。例如:

interface IFinancialModel { 
    IList<IExpense> Expenses { get; } 
} 

然後實現一個滿足您的需求的列表。例如:

class FinancialModel : IFinancialModel { 
    private IList<IExpense> _expenses = new List<IExpense>(); 
    IList<IExpense> Expenses { get { return _expenses; } } 
} 

我同意@Stefan雖然暴露了一個列表中斷封裝,應該通常應避免。