2

継承は通常悪いコード設計であると読んでいます。それにもかかわらず、ビジネス オブジェクトの List または BindingList から継承することがあります。以下は、私が使用する可能性のある単純なビジネス オブジェクトです。

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

のコレクションを保持するオブジェクトには、次の 2 つのオプションがあります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>s を拡張できますか?

編集:例を追加します。

コメントで、送信できる通知をより適切に制御したい場合にオプション B を使用する可能性があると述べましたBindingList。更新のバッチを開始し、後で同じ更新のバッチを終了することを示したい場合があります。そのためには、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。この例では重要ではないと思います。)

4

1 に答える 1

0

コンテキストがなければ、どちらを好むかを決めるのは難しいです。通常、問題のメンタル モデルに従ってコードを構成するのが好きです。

次の質問を自問してください。

は修辞 RowHolderType的なBindingList<RowType>意味でですか? そうであれば、継承は 100% 適切です。

于 2013-03-12T14:58:34.850 に答える