2013-03-12 75 views
1

我一直在阅读,继承通常是糟糕的代码设计。尽管如此,我有时会从业务对象的列表或绑定列表继承。这里有一个简单的业务对象,我可能会使用:这是一个很好的使用继承的例子吗?

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

来电者是负责发送BeforeListChangedAfterListChanged通知。我没有尝试过这种与“Has-A”型关系,但我认为该代码会更丑。 (请注意,我忽略了RowTypeHolderEventArgsRowTypeHolderEventArgs.ChangeType的定义,我认为这个例子并不重要。)

+7

'我一直在阅读,继承通常是不好的代码设计。这是无稽之谈。选项B通常是你最好的选择。如果在你的设计中有什么不好的地方,那就是调用你的类'RowType',它不告诉我它实际是什么。 – 2013-03-12 14:54:48

+0

这取决于。你为什么首先做这样的课? – SLaks 2013-03-12 14:55:01

+2

继承是OOP中的一个关键概念。唯一不好的继承是钻石继承。 – MyCodeSucks 2013-03-12 14:55:51

回答

0

没有更多的上下文,我很难决定我更喜欢哪一个,我通常喜欢结构化代码在我的心理模型的问题之后。

问自己一个问题:

在修辞意义RowHolderType一个BindingList<RowType>?如果是,那么继承是100%恰当的。

+0

这不是你需要自问的唯一事情。例如,是否在考虑基于继承的基础类?有很多类应该被“密封”,但不是,并且类被编写成实际上不应被继承(因为设计不够强壮)。如果它没有提供足够的方法来根据需要修改继承者的行为(例如,使方法是虚拟的并且具有可以被覆盖的受保护的实现方法),那么使用合成可能会更好。 – Servy 2013-03-12 15:00:47

+0

@Sam我是,有一个典型的例子来质疑'是'范式,一个正方形'是'四边形但很可能不会继承它。 – 2013-03-12 15:04:25