This question already has answers here:
Why not inherit from List<T>?
(27个答案)
4年前关闭。
当一个类必须具有某种对象的容器(集合)时,有几种选择,而我想知道我更喜欢哪种实现。
这里遵循我发现的选项:
优点:AClass不依赖于集合的具体实现(在本例中为List)。
缺点:AClass没有用于添加和删除元素的界面
优点:与IEnumerable相同,并且具有用于添加和删除元素的界面
缺点:ICollection接口(interface)定义了其他人很少使用的方法,仅出于接口(interface)的目的而实现这些方法就很无聊。 IEnumerable LINQ扩展也可以解决其中的一些问题。
优点:无需实现任何方法。调用方可以调用List实现的任何方法
缺点:AClass依赖于集合列表,如果更改,则可能需要更改某些调用者代码。同样,AClass不能继承任何其他类。
问题是:我更愿意声明我的类(class)包含一个同时支持添加和删除操作的集合?或其他建议...
如果您不想实现自己的集合,这是最好的方法。您不需要实现
(27个答案)
4年前关闭。
当一个类必须具有某种对象的容器(集合)时,有几种选择,而我想知道我更喜欢哪种实现。
这里遵循我发现的选项:
public class AClass : IEnumerable<string>{
private List<string> values = new List<string>()
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
public IEnumerator<T> GetEnumerator(){
return values.GetEnumerator();
}
}
优点:AClass不依赖于集合的具体实现(在本例中为List)。
缺点:AClass没有用于添加和删除元素的界面
public class AClass : ICollection<string>{
private List<string> values = new List<string>()
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
public IEnumerator<T> GetEnumerator(){
return values.GetEnumerator();
}
//other ICollectionMembers
}
优点:与IEnumerable相同,并且具有用于添加和删除元素的界面
缺点:ICollection接口(interface)定义了其他人很少使用的方法,仅出于接口(interface)的目的而实现这些方法就很无聊。 IEnumerable LINQ扩展也可以解决其中的一些问题。
public class AClass : List<string>{
}
优点:无需实现任何方法。调用方可以调用List实现的任何方法
缺点:AClass依赖于集合列表,如果更改,则可能需要更改某些调用者代码。同样,AClass不能继承任何其他类。
问题是:我更愿意声明我的类(class)包含一个同时支持添加和删除操作的集合?或其他建议...
最佳答案
我的建议是在您的类中定义一个通用列表,然后编写其他Add
和Remove
方法,并实现IEnumerable:
public class MyClass : IEnumerable
{
private List<string> myList;
public MyClass()
{
myList = new List<string>();
}
public void Add(string item)
{
if (item != null) myList.Add(item);
}
public void Remove(string item)
{
if (myList.IndexOf(item) > 0) myList.Remove(item);
}
public IEnumerable<string> MyList { get { return myList; } }
public IEnumerator GetEnumerator()
{
return myList.GetEnumerator();
}
}
如果您不想实现自己的集合,这是最好的方法。您不需要实现
Add
和Remove
方法的接口(interface)。我猜想这样的其他方法可以满足您的需求。关于c# - 在类里面有一个收藏,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21246047/