Windows Forms プログラムで、フォームの継承ってあまりやらない?
いや、System.Windows.Forms.Form を継承して独自フォームって話じゃなく、その独自フォームをさらに継承した孫フォームっていう作りについて。
やる場合、デザイナの都合上、いくつかの制限があるんだよね。
制限の一覧ってどこかに文書化されてるかな?
わかってる範囲では、
- フォームクラスはファイル中の先頭のクラスでなければならない。
- フォームが抽象クラスではいけない。
- フォームには引数をとらないコンストラクタがなければならない。
てトコか。
最初のはまぁ、先頭に持ってくることに何の躊躇もないからいい。
が、後の2つは、できることなら勘弁して欲しい。
デザイナがゴネるから、しぶしぶではあるけれど、抽象クラスではなくして、引数なしコンストラクタも追加したとする(なんと、このコンストラクタはprivateでもいい!)。
で、「それは呼ばない約束ね」ということにして、引数つきコンストラクタも用意したとする。
ここでまた詰まる。
親フォームに引数つきコンストラクタを追加したら、子フォームからもそいつを呼ばなきゃいけない。
けど、子フォームは InitializeComponent も呼ばなきゃいけない。
InitializeComponent は、デザイナ様のための引数なしコンストラクタからも呼ばなきゃいけないから、2箇所に InitializeComponent(); って書くよりは、引数つきコンストラクタから引数なしコンストラクタを呼ぶようにしたい。
ところが、親フォームと自フォームのコンストラクタはどちらか一方しか呼べない、という制限がある。
結局、引数つきコンストラクタは作らないで、別途 Initialize みたいなメソッドを用意して、「フォームを表示する前にこれを呼ぶこと」っていうお約束を作るのがベストなのかなー。