2

我一直在阅读继承通常是糟糕的代码设计。尽管如此,我有时会从业务对象的 List 或 BindingList 继承。这是我可能使用的一个简单的业务对象:

public class RowType
{
    public string Name { get; set; }
    public double Sales { get; set; }
}

以下是包含RowTypes 集合的对象的两个选项:

//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));
    }
}

调用者负责发送BeforeListChangedAfterListChanged通知。我还没有尝试过使用“Has-A”类型的关系,但我认为该代码会更丑陋。(请注意,我省略了RowTypeHolderEventArgsand的定义RowTypeHolderEventArgs.ChangeType。我认为这对于这个例子并不重要。)

4

1 回答 1

0

如果没有更多上下文,我很难决定我更喜欢哪一个,我通常喜欢根据我对问题的心理模型来构建代码。

问自己一个问题:

RowHolderType修辞BindingList<RowType>意义上的吗?如果是,那么继承是 100% 合适的。

于 2013-03-12T14:58:34.850 回答