我正在尝试创建一个excel文档生成器项目。目前我正在研究细胞样式部分。
所以我有下一个结构:
public class Styles : List<Style>, ISerializableClass
{
...some special methods...
}
我想要实现的目标:
当一些Style(项目)被添加到样式时,我想自动添加/修改/更新样式ID。
换句话说,我想覆盖基本list.Add()行为。 我如何实现这一目标?
或者我应该在我的Styles类中添加此方法:
public void Add(Style style)
{
/*
* Some mu logic
*/
base.Add(style);
}
隐藏默认的List.Add()方法?
答案 0 :(得分:2)
最佳做法是自己实施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>
不是一个好主意的原因的详细信息,请参阅this question。
你应该几乎总是避免隐藏基类方法。因为这很容易被代码击败:
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
恕我直言,方法隐藏的唯一可接受的用例是IEnumerable<T>.GetEnumerator()
隐藏IEnumerable.GetEnumerator()
这样的情况,其中两种方法完全相同。