这个类应该实现ICollection,IList,List还是两者都没有?

时间:2016-05-12 14:41:26

标签: c# list collections

我正在尝试创建一个类,该类包含一些已定义TimeSpan后过期(从集合中删除)的项目集合;我意识到,如果我不主动删除项目,有些可能会过期,仍然在集合中。

到目前为止,我无法决定如何实现此类。我不确定是否应该实施ICollectionIList,子类List或包裹List

public struct EDLItem<T>
{
    public T Data { get; set; }
    public DateTime Created { get; set; }

    public EDLItem(T data) : this()
    {
        Data = data;
        Created = DateTime.Now;
    }

    public Boolean IsExpired(TimeSpan lifetime)
    {
        TimeSpan lifeSpan = DateTime.Now.Subtract(Created);
        return TimeSpan.Compare(lifeSpan, lifetime) == 1;
    }
}

public class ExpiringDataList1<T> : ICollection<EDLItem<T>>{}

public class ExpiringDataList2<T> : IList<EDLItem<T>>{}

public class ExpiringDataList3<T> : List<EDLItem<T>>{}

public class ExpiringDataList<T>
{
    public TimeSpan DataLifetime { get; set; }
    private List<EDLItem<T>> DataList { get; set; }

    public ExpiringDataList(TimeSpan dataLifetime)
    {
        DataLifetime = dataLifetime;
        DataList = new List<EDLItem<T>>();
    }

    public void CheckExperiations()
    {
        DataList.RemoveAll(item => item.IsExpired(DataLifetime));
    }

    public void Add(T item)
    {
        DataList.Add(new EDLItem<T>(item));
        CheckExperiations();
    }
}

我的计划是检查/删除项目添加到集合时或者迭代集合时已经过期的项目(在收集IENumerable之前)。

我应该为此实施做出什么选择?

1 个答案:

答案 0 :(得分:3)

一些建议:

  • 一般来说,更喜欢组合继承。
  • 除非您正在构建新的列表抽象,否则不要扩展List<T>,即使这样,也可能不会。听起来你实际上 正在构建这样的抽象,大多数问及扩展List的人都没有。在这种情况下,问自己两个问题:(1)我是否需要列表的基础机制,(2)是否有人会多态地使用这个东西?见下一点。
  • 存在启用多态的接口。在决定是否实现接口时,请考虑客户端是否将多态地使用您的类与其他不相关的类。是否有人想要对你的东西进行排序,搜索,过滤或加入?然后实施IEnumerable<T>。是否有人将其传递给采用IList<T>的方法?然后执行。但是,这个决定应该由客户要求驱动,而不是由您可能实施的内容驱动。