我正在尝试创建一个类,该类具有在某个定义的TimeSpan
之后过期(从集合中删除)的项的集合;我意识到,如果我不主动删除这些项目,有些项目可能会过期,并且仍在收藏中。
到目前为止,我还不能决定如何实现这个类。我不确定是应该实现ICollection
、IList
、子类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>
的方法吗?然后实施它。但这个决定应该由客户需求驱动,而不是由您可能实现的内容驱动