Out of Memory

本ブログは更新を停止しました。Aerieをよろしくお願いいたします。

目次

Blog 利用状況

ニュース

2009年3月31日
更新を停止しました。引き続きAerieを御愛顧くださいませ。
2009年2月3日
原則としてコメント受付を停止しました。コメントはAerieまでお願いいたします。
詳細は2月3日のエントリをご覧ください。
2008年7月1日
Microsoft MVP for Developer Tools - Visual C++ を再受賞しました。
2008年2月某日
MVPアワードがVisual C++に変更になりました。
2007年10月23日
blogタイトルを変更しました。
2007年7月1日
Microsoft MVP for Windows - SDKを受賞しました!
2007年6月20日
スキル「ニュース欄ハック」を覚えた!
2006年12月14日
記念すべき初エントリ
2006年12月3日
わんくま同盟に加盟しました。

カレンダー

中の人

αετο? / aetos / あえとす

シャノン? 誰それ。

顔写真

埼玉を馬鹿にする奴は俺が許さん。

基本的に知ったかぶり。興味を持った技術に手を出して、ちょっと齧りはするものの、それを応用して何か形にするまでは及ばずに飽きて放り出す人。

書庫

日記カテゴリ

フォームの継承について

Windows Forms プログラムで、フォームの継承ってあまりやらない?
いや、System.Windows.Forms.Form を継承して独自フォームって話じゃなく、その独自フォームをさらに継承した孫フォームっていう作りについて。

やる場合、デザイナの都合上、いくつかの制限があるんだよね。
制限の一覧ってどこかに文書化されてるかな?
わかってる範囲では、

  • フォームクラスはファイル中の先頭のクラスでなければならない。
  • フォームが抽象クラスではいけない。
  • フォームには引数をとらないコンストラクタがなければならない。

てトコか。

最初のはまぁ、先頭に持ってくることに何の躊躇もないからいい。
が、後の2つは、できることなら勘弁して欲しい。

デザイナがゴネるから、しぶしぶではあるけれど、抽象クラスではなくして、引数なしコンストラクタも追加したとする(なんと、このコンストラクタはprivateでもいい!)。
で、「それは呼ばない約束ね」ということにして、引数つきコンストラクタも用意したとする。

ここでまた詰まる。
親フォームに引数つきコンストラクタを追加したら、子フォームからもそいつを呼ばなきゃいけない。
けど、子フォームは InitializeComponent も呼ばなきゃいけない。
InitializeComponent は、デザイナ様のための引数なしコンストラクタからも呼ばなきゃいけないから、2箇所に InitializeComponent(); って書くよりは、引数つきコンストラクタから引数なしコンストラクタを呼ぶようにしたい。
ところが、親フォームと自フォームのコンストラクタはどちらか一方しか呼べない、という制限がある。

結局、引数つきコンストラクタは作らないで、別途 Initialize みたいなメソッドを用意して、「フォームを表示する前にこれを呼ぶこと」っていうお約束を作るのがベストなのかなー。

投稿日時 : 2008年4月30日 19:02

Feedback

# re: フォームの継承について 2008/04/30 19:12 シャノン

InitializeComponent が virtual で、デフォルトで親フォームのを呼んでくれればいいのになぁ。

# re: フォームの継承について 2008/04/30 19:17 さかもと画伯

デザイン回りが面倒なので、よほどフォームの数が多くない限り継承フォームは使わない派です。たしか@ITで質問した記憶が・・・、その時も結局「継承フォームってwww」みたいな結論だったような・・・。

# re: フォームの継承について 2008/04/30 20:04 中博俊

3つめはいまや常識ともいえるので、あきらめてください。

# re: フォームの継承について 2008/04/30 20:20 シャノン

> 3つめはいまや常識

ソースキボンヌ。
中さんは理由を言ってくれない傾向があるのがよろしくないです。

# re: フォームの継承について 2008/04/30 20:31 Hirotow

割りとよく使いますね。
有名なところだとドッキングウィンドウのライブラリとか。
引数付コンストラクタではなく引数付のShowとかShowDialogメソッドを追加するのがスマートな解決法かと思います。

# re: フォームの継承について 2008/04/30 23:44 THREE-ONE

> フォームが抽象クラスではいけない。
同じくコレが痛いです。
ASP.NET でも同様なんですが、規程ページクラス作って画面IDとか abstract なメンバを持たせたいんですが不可なんですよね。
仕方ないので virtual で作って NotImplementationException とか throw したりする。
派生先ごとの差分は外部に切り出したりとか色々小細工しなければならない。
めんどいっす

# re: フォームの継承について 2008/04/30 23:49 シャノン

> 仕方ないので virtual で作って NotImplementationException とか throw したりする。

自前で作ったコードならまだしも、コンストラクタで例外投げるとデザイナエラーになったりしそう。

# re: フォームの継承について 2008/04/30 23:56 黒龍

継承したフォームは使いますね。
> InitializeComponent(); って書くよりは、引数つきコンストラクタから引数なしコンストラクタを呼ぶようにしたい。
> ところが、親フォームと自フォームのコンストラクタはどちらか一方しか呼べない、という制限がある。
これがいまいちわかんないです。なにか制限があるのですか?

# re: フォームの継承について 2008/05/01 0:09 シャノン

親フォームの引数付きコンストラクタと自フォームの引数なしコンストラクタの両方は呼べんです。

public ChildForm( int hoge ) : base( hoge ), this()
{
}

これはコンパイルエラー。

# re: フォームの継承について 2008/05/01 0:19 黒龍

あ~なるほど。そういう意味でしたか。
baseの引数なしはプライベートにしてるくらいなので自身の引数無しを呼ばないがしっくり来そうに思いました。

# re: フォームの継承について 2008/05/01 0:37 中博俊

>ソースキボンヌ。
>中さんは理由を言ってくれない傾向があるのがよろしくないです。

ソースなんてあるわけないっしょ?
傾向を言ってるんだから。

基本的には暗黙のシリアライズだったり、暗黙のインスタンス化をデザイナとかいろんなところでやるようになってきているので、C++流の初期化必須コンストラクタはもはや時代遅れでしょうと言っているだけです。
またコンストラクタで例外も良くないといわれて久しいので、コンストラクタは何もしないってのが傾向です。

# re: フォームの継承について 2008/05/01 0:52 かずくん

> やる場合、デザイナの都合上、いくつかの制限があるんだよね。
たしか、「Loadイベントのハンドラで例外を発生させてはだめ」ってのもあった希ガス

デザイン時かどうかを判断して、デザイナが通らない様にコーディングすればおk

# re: フォームの継承について 2008/05/01 0:53 シャノン

> またコンストラクタで例外も良くないといわれて久しいので、

これは誰が何処で言ってるのか示してもらえますかね?
コンストラクタが例外を出すとデザイナがこけるから?
それとも、デザイナに関係なく一般的に?

で、この件に限らず、
> 中さんは理由を言ってくれない傾向があるのがよろしくないです。
とは思ってます。要約しすぎ。

# re: フォームの継承について 2008/05/01 0:54 シャノン

> たしか、「Loadイベントのハンドラで例外を発生させてはだめ」ってのもあった希ガス

ダメってことはないが、それは Form.Show なり Form.ShowDialog の呼び出し元では捕捉できんので無意味だよ、ってことじゃないかなぁ。

# re: フォームの継承について 2008/05/01 1:25 ゆう

> またコンストラクタで例外も良くないといわれて久しいので、

コンストラクタでの例外に関しては一般的にだと思います。
理由は、コンストラクタで例外を出すと、
オブジェクトの生成に失敗するため、
デストラクタが実行されなくなるからだったと思います。

# re: フォームの継承について 2008/05/01 10:49 じゃんぬねっと

自前 Form を継承するんじゃなくて UserControl で継承してポトペタするようにしています。

デザインまで継承することは絶対にやらないです。
イミフなビルドエラーが発生しやすくなるのと、リソースひっぺがえしを喰らう、さらに窮屈になるだけなのでもし継承しても機能的な部分かなぁ。
Enter で Focus 移動のようなものを急遽対応しなくてはいけない時にだけ利用しました。

# re: フォームの継承について 2008/05/02 4:15 渋木宏明(ひどり)

総合的には、あまりいい思い出がないです>孫フォーム

タイトル
名前
Url
コメント