我一直在阅读,继承通常是糟糕的代码设计。尽管如此,我有时会从业务对象的列表或绑定列表继承。这里有一个简单的业务对象,我可能会使用:这是一个很好的使用继承的例子吗?
public class RowType
{
public string Name { get; set; }
public double Sales { get; set; }
}
这里有保存的RowType
个集合的对象两种选择:
//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>
?
编辑:添加一个例子。
我在评论中提到,我可能在需要更好地控制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
和RowTypeHolderEventArgs.ChangeType
的定义,我认为这个例子并不重要。)
'我一直在阅读,继承通常是不好的代码设计。这是无稽之谈。选项B通常是你最好的选择。如果在你的设计中有什么不好的地方,那就是调用你的类'RowType',它不告诉我它实际是什么。 – 2013-03-12 14:54:48
这取决于。你为什么首先做这样的课? – SLaks 2013-03-12 14:55:01
继承是OOP中的一个关键概念。唯一不好的继承是钻石继承。 – MyCodeSucks 2013-03-12 14:55:51