同じメンバー関数を持ったユーザコントロールを複数作る方

唐突ですが.NETのお話。

複数種類のユーザコントロールを作る必要があって、それらは共通のメンバー関数を持っています。
それらの複数ユーザコントロールを管理するクラスからユーザコントロールに対してブロードキャストしたかったのでPanelコントロールから基底コントロールクラス(以下BaseControl)を作り、そいつに共通のメンバー関数を持たしました。
複数種類のユーザコントロールを作る場合、たとえばUserControl1とUserControl2の2種類をBaseControlをベースに作ったわけです。


で、この方法だと、UserControl1もUserControl2もBaseControlもボタンを載せるといった作業をデザイナで画面デザインできません。
デザイナを無理やり開いても「ドキュメントを読み込み中にエラーが発生しました。このエラーを修正してから、再度ドキュメントを読み込んでください。」というエラーがでます。
こうなるとコード上で動的につくるしかありません。
これは、Forms.UserControlから継承したクラスはデザイナで作業できますが、さらに継承したクラスは作業できない制約があるからです。
BaseControlはPanelから継承したクラスなのでBaseControlもデザイナで変更できません。


まぁ、ここまでは@IT掲示板などでできないと書かれています。
では、どうするのか?っていうのが書いてません。


実は、上の例のUserControl1とUserControl2をForms.UserControlから継承すればデザイナからデザインできるようになります。
いや、それはわかっとるちゅうねんという方も多いかも。それはそうなんですけど、それだけではブロードキャストでメンバー関数を呼び出すことは不可能です。


共通のメンバー関数をIBaseといった名前のインターフェイスで宣言して、インターフェイスを含んだコントロールにすればいいんです。


で、ブロードキャストするときは、そのクラスでインターフェイスが使われているかどうか判定すればいいんです。
第14章 インターフェイスの活用 (2/4):連載 改訂版 C#入門 - @ITにあるとおり、メソッドだけでなくプロパティにも使えます。


本当はサンプルコード書いたらいいんだろうけど時間ないので以下略