此类应该实现ICollection、IList、List还是两者都不实现



我正在尝试创建一个类,该类具有在某个定义的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之前),检查/删除已过期的项目。

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

一些建议:

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

相关内容

最新更新