C# 具体类实现中的IEnumerable与List
我正在为金融建模编写一个类库 我想使用接口来定义模型,以创建用于测试的抽象,以及以后可能添加的新的具体类 我正在努力研究如何定义事物列表,以便以后可以在具体类中添加到这些列表中 例如,如果我将一个接口定义为在我的模型中有一个名为 IEnumerable费用{get;set;} 后来,我想创建一个名为ABCModel的具体类,其中包含一个具体的XYZExpense列表,那么实现这些列表的最佳方法是什么,这样我就可以轻松地向列表中添加更多项 我无法将列表转换为IEnumerable 例如:C# 具体类实现中的IEnumerable与List,c#,.net,oop,interface,concrete,C#,.net,Oop,Interface,Concrete,我正在为金融建模编写一个类库 我想使用接口来定义模型,以创建用于测试的抽象,以及以后可能添加的新的具体类 我正在努力研究如何定义事物列表,以便以后可以在具体类中添加到这些列表中 例如,如果我将一个接口定义为在我的模型中有一个名为 IEnumerable费用{get;set;} 后来,我想创建一个名为ABCModel的具体类,其中包含一个具体的XYZExpense列表,那么实现这些列表的最佳方法是什么,这样我就可以轻松地向列表中添加更多项 我无法将列表转换为IEnumerable 例如: pub
public interface IFinancialModel
{
IEnumerable<IExpense> Expenses { get; }
IEnumerable<IRevenue> Revenue { get; }
IEnumerable<IAsset> Assets { get; }
IEnumerable<ILiability> Liabilities { get; }
}
class FinancialModel : IFinancialModel {
private IList<IExpense> _expenses = new List<IExpense>();
IList<IExpense> Expenses { get { return _expenses; } }
}
公共接口IFinancialModel
{
IEnumerable Expenses{get;}
IEnumerable收入{get;}
IEnumerable资产{get;}
IEnumerable负债{get;}
}
我需要一个名为public class Financial Model:iFinancial Model的具体类
并且能够添加具体的项目
我应该创建自己的“添加”方法吗?理想情况下,我希望利用内置列表功能,而不是重新发明轮子。这取决于您实际想要做什么。不建议使用
列表
或IList
属性,因为您可以使用它做任何事情(如清除
,添加
等等),而所属类不知道它。这不利于封装。您将无法在更改时执行某些操作(例如设置脏标志、触发更改的事件或进行验证)
IEnumerable
是一个不错的选择
您可以添加setter,但不应采用通过引用设置为属性的值。它可以是任何你不想引用的东西,比如Linq查询,甚至数据库查询。你只想要这些东西。(也考虑到来自外部的集合的引用可以被分配给其他实例,当它在那里被改变时,会产生非常坏的副作用,但是这里不应该改变。”
//使用setter的示例实现
私人清单费用
公共开支
{
获取{返回费用;}
设置{expenses=value.ToList();}
}
或者,您可以实现自己的
添加
、添加范围
、删除
或清除
等方法。但是,如果主要用例是一次性设置所有项目,那么您只能有一个SetExpenses
方法,这与我之前展示的属性上的setter相同。您可以考虑将其保持为内部数组。 您所要查找的是<代码> IIST 。这是一个允许您在隐藏实际列表实现的同时公开列表的接口。例如:
interface IFinancialModel {
IList<IExpense> Expenses { get; }
}
接口IFinancialModel{
IList费用{get;}
}
然后用满足您需求的列表来实现。例如:
public interface IFinancialModel
{
IEnumerable<IExpense> Expenses { get; }
IEnumerable<IRevenue> Revenue { get; }
IEnumerable<IAsset> Assets { get; }
IEnumerable<ILiability> Liabilities { get; }
}
class FinancialModel : IFinancialModel {
private IList<IExpense> _expenses = new List<IExpense>();
IList<IExpense> Expenses { get { return _expenses; } }
}
类财务模型:IFinancialModel{
私人IList_费用=新列表();
IList费用{get{return{U费用;}}
}
不过,我同意@Stefan的观点,公开列表会破坏封装,通常应该避免 如果需要列表功能,请将它们定义为IList,而不是全部定义为IEnumerable。@Kevin正是我所写的。。。但你先说了,我会试一试的。完全同意您在封装中的评论。如果我想向任何子列表添加新项,我是否需要为具体类编写自定义ADD方法?由于IEnumerable不公开Add()方法?@user3637002:我将编写一个Add方法。