2

私は最近、必要なイベントにフックして追加機能を実行するComponentだけのカスタム派生クラスを作成することにより、さまざまな WinForms コントロールのいくつかにカスタム機能を追加しています。Control

たとえばListBox、アプリケーションのいくつかの異なるコントロールにドラッグ アンド ドロップ機能を追加したかったのでDragAndDropListBoxComponent、クラスから継承するを作成し、Componentこの新しいコンポーネントをフォームに追加して、機能を追加する必要がありました。DragAndDropListBoxComponentListBoxプロパティを、機能を追加したいリスト ボックスに追加しました。

標準機能を拡張するこの方法が気に入っています。同じものに対してControl複数のカスタム動作タイプを作成し、それらを組み合わせて興味深い効果を得ることができるからです。これはまた、継承よりも合成の原則を支持します。ComponentControl

Component class list this を使用することに気付くまで、しばらく時間がかかったようです。これは、オンラインでそのような方法で使用されているのを見たことがないためです。したがって、私の質問です。カスタム コンポーネント クラスは一般的にこのように使用されますか?

4

1 に答える 1

6

他のオプションがありますが、それが望ましい結果を達成し、ソリューションが毎回あなたに対して働いていると感じない限り、どれを選ぶかはそれほど重要ではありません。

可能な代替手段は、を使用することExtender Providerです。エクステンダープロバイダーの利点の1つは、各コントロールに「AllowDragAndDrop」プロパティを追加しているように見えることです。(この場合、プロパティはインスタンスにのみ追加されListBoxます)この新しいプロパティはデザイン時に表示されるため、他のコンシューマーはDragAndDrop機能の実装や場所の詳細を知る必要はなく、にプロパティを設定するだけで済みますPropertyGrid

別の可能な代替手段は、デコレータパターンを使用することです。これは、たとえば.NETストリームで使用されます。ストリームがあり、古いストリームをコンストラクターパラメーターとして使用する新しいストリームを作成することにより、追加の動作(バッファリング、(解凍)圧縮、暗号化など)を追加します。あなたの場合、あなたはでラップするでしょListBoxDragAndDropListBox。ただし、この特定のケースでは、このアプローチは利点よりも問題を引き起こす可能性があることに注意してください。

さらに別の可能な代替案は、拡張したいコントロールから継承し、「CustomBehaviors」のリストをコントロールに追加することです。CustomBehaviorsは、インターフェイスの具体的なインスタンスをコレクションに追加することで、コントロールに新しい動作を追加できるインターフェイスを実装します。

于 2012-09-04T14:47:53.630 に答える