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を追加するととたんにバグ発覚です。)
また、通常のイベント処理だけではない部分で検討箇所も増えます。
フォームを継承する場合には入念な調査が必要です。
気をつけましょう。