This question already has answers here:
Why not inherit from List<T>?

(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)包含一个同时支持添加和删除操作的集合?或其他建议...

最佳答案

我的建议是在您的类中定义一个通用列表,然后编写其他AddRemove方法,并实现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();
    }
}

如果您不想实现自己的集合,这是最好的方法。您不需要实现AddRemove方法的接口(interface)。我猜想这样的其他方法可以满足您的需求。

关于c# - 在类里面有一个收藏,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21246047/

10-12 00:29
查看更多