中の技術日誌ブログ

C#とC++/CLIと
VBと.NETとWindowsで戯れる
 

目次

Blog 利用状況

ニュース

自己紹介

東京でソフトウェアエンジニアをやっています。
お仕事大募集中です。
記事執筆や、講師依頼とかでも何でもどうぞ(*^_^*)
似顔絵 MSMVPロゴ
MSMVP Visual C# Since 2004/04-2013/03

記事カテゴリ

書庫

日記カテゴリ

00-整理

01-MSMVP

Formの継承

WindowsFormsでフォーム(画面)を作るときにFormを継承して実装します。

その新しいFormを継承したFormを作った場合にイベント処理が結構複雑化します。

public class FormA : Form
{
  this.Resize += new System.EventHandler(this.FormA_Resize);
  private void FormA_Resize(object sender, System.EventArgs e)
  {
    //高さを100に固定する
    if ( this.Height != 100 )
    {
      this.Height = 100;
    }
  }
}
public class FormB : FormA
{
  this.Resize += new System.EventHandler(this.FormB_Resize);
  private void FormB_Resize(object sender, System.EventArgs e)
  {
    //高さを200に固定する
    if ( this.Height != 200 )
    {
      this.Height = 200;
    }
  }
}

こういった書き方をすると適切に動きません。

なぜかというと、FormBのResizeイベントにはFormA_Resize, FormB_Resizeの二つが登録された状態になっているからです。(+=ですからね)

public class FormA : Form
{
  this.Resize += new System.EventHandler(this.FormA_Resize);
  protected virtual void FormA_Resize(object sender, System.EventArgs e)
  {
    //高さを100に固定する
    if ( this.Height != 100 )
    {
      this.Height = 100;
    }
  }
}
public class FormB : FormA
{
  protected override void FormA_Resize(object sender, EventArgs e)
  {
    //高さを200に固定する
    if ( this.Height != 200 )
    {
      this.Height = 200;
    }
  }
}

継承プランをコードにするとこうなります。

フォーム継承は通常の継承より、より複雑になりがちです。
基底フォームの影響もより多く受けます。(今回の場合であれば継承先がResizeを使っていても、基底がResizeを使わなければ適切に動作します。基底にResizeを追加するととたんにバグ発覚です。)
また、通常のイベント処理だけではない部分で検討箇所も増えます。
フォームを継承する場合には入念な調査が必要です。

気をつけましょう。

投稿日時 : 2004年5月30日 1:06

コメントを追加

No comments posted yet.
タイトル
名前
URL
コメント