我一直在阅读继承通常是糟糕的代码设计。尽管如此,我有时会从业务对象的 List 或 BindingList 继承。这是我可能使用的一个简单的业务对象:
public class RowType
{
public string Name { get; set; }
public double Sales { get; set; }
}
以下是包含RowType
s 集合的对象的两个选项:
//Option A: "Has-A" relationship
public class RowHolderType
{
private readonly BindingList<RowType> _rows;
public BindingList<RowType> Rows { get { return this._rows; } }
public RowHolderType() { this._rows = new BindingList<RowType>(); }
}
//Option B: "Is-A" relationship
public class RowHolderType : BindingList<RowType>
{
public RowHolderType() : base() { }
public RowHolderType(IList<RowType> list) : base(list) { }
}
我通常使用选项 B。我发现使用选项 B 时通常需要编写更少的代码。我通常使用这样的类来在 WPF 窗口中显示可编辑数据的列表。
使用选项 B 是否有一些隐藏的缺点?或者我可以继续愉快地扩展BindingList<T>
s 吗?
编辑:添加一个例子。
我在评论中提到,有时当我想更好地控制BindingList
可以发送的通知时,我可能会使用选项 B。我可能想表明我正在开始一批更新,然后再完成同一批更新。为此,我将继承 BindingList 并添加一些功能:
public class RowTypeHolder : BindingList<RowType>
{
public event BeforeListChangedEventHandler BeforeListChanged;
public delegate void BeforeListChangedEventHandler(RowTypeHolder sender, RowTypeHolderEventArgs e);
public event AfterListChangedEventHandler AfterListChanged;
public delegate void AfterListChangedEventHandler(RowTypeHolder sender, RowTypeHolderEventArgs e);
public void OnBeforeListChanged(RowTypeHolderEventArgs.ChangeType change, string eventName)
{
if (this.BeforeListChanged != null)
this.BeforeListChanged(this, new RowTypeHolderEventArgs(change, 0, eventName));
}
public void OnAfterListChanged(RowTypeHolderEventArgs.ChangeType change, int numChanges, string eventName)
{
if (this.AfterListChanged != null)
this.AfterListChanged(this, new RowTypeHolderEventArgs(change, numChanges, eventName));
}
}
调用者负责发送BeforeListChanged
和AfterListChanged
通知。我还没有尝试过使用“Has-A”类型的关系,但我认为该代码会更丑陋。(请注意,我省略了RowTypeHolderEventArgs
and的定义RowTypeHolderEventArgs.ChangeType
。我认为这对于这个例子并不重要。)