我正在尝试创建一个Excel文档生成器项目。目前我正在研究细胞样式部分。
所以我有下一个结构:
public class Styles : List<Style>, ISerializableClass
{
...some special methods...
}
我想实现的目标:
当某些样式(项目)被添加到我要自动添加/修改/更新样式ID的样式中时。
换句话说,我想覆盖基本列表.add()行为。我该如何实现?
,或者我应该在样式类中添加此方法:
public void Add(Style style)
{
/*
* Some mu logic
*/
base.Add(style);
}
隐藏默认List.add()方法?
最好的做法是自己实现IList<T>
,而不是从List<T>
继承。然后,您可以将大部分实现委派给List<T>
字段:
public class Styles : IList<Style>, ISerializableClass
{
private List<Style> _list = new List<Style>();
public void Add(Style style)
{
// Your stuff here
_list.Add(style);
}
// ...
}
有关为什么从List<T>
继承不是一个好主意的更多详细信息。
您应该几乎总是避免隐藏基类方法。因为这很容易被诸如:
之类的代码击败var stylesList = new Styles(); // Suppose this hides List<T>.Add
var castedList = (IList<Styles>)stylesList;
castedList.Add(new Style()); // <-- this still calls List<T>.Add
IMHO,唯一可接受的方法用于方法隐藏的用例是在诸如IEnumerable<T>.GetEnumerator()
隐藏IEnumerable.GetEnumerator()
之类的情况下,这两种方法无论如何都完全相同。