Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具体类实现中的IEnumerable与List_C#_.net_Oop_Interface_Concrete - Fatal编程技术网

C# 具体类实现中的IEnumerable与List

C# 具体类实现中的IEnumerable与List,c#,.net,oop,interface,concrete,C#,.net,Oop,Interface,Concrete,我正在为金融建模编写一个类库 我想使用接口来定义模型,以创建用于测试的抽象,以及以后可能添加的新的具体类 我正在努力研究如何定义事物列表,以便以后可以在具体类中添加到这些列表中 例如,如果我将一个接口定义为在我的模型中有一个名为 IEnumerable费用{get;set;} 后来,我想创建一个名为ABCModel的具体类,其中包含一个具体的XYZExpense列表,那么实现这些列表的最佳方法是什么,这样我就可以轻松地向列表中添加更多项 我无法将列表转换为IEnumerable 例如: pub

我正在为金融建模编写一个类库

我想使用接口来定义模型,以创建用于测试的抽象,以及以后可能添加的新的具体类

我正在努力研究如何定义事物列表,以便以后可以在具体类中添加到这些列表中

例如,如果我将一个接口定义为在我的模型中有一个名为

IEnumerable费用{get;set;}

后来,我想创建一个名为ABCModel的具体类,其中包含一个具体的XYZExpense列表,那么实现这些列表的最佳方法是什么,这样我就可以轻松地向列表中添加更多项

我无法将列表转换为IEnumerable

例如:

 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方法。