フォームの継承を使うことは希だとは思うが、
デバイス毎に、ライブラリがあり、その違いを吸収するために、
継承を使おうと思ったのだが、
たとえば、Delphiだと、
親のフォーム(配下のコンポネント含む)にイベント記述したら、
継承した子のフォームで、同じイベントに記述した場合、
親のイベントは、無視される。
親のイベントを処理したい場合は、イベントコード中の好きな箇所で、
inherited;
と書くことで、親のイベントを処理してくれる。
し
かし、C# (今更、VS2005だが・・・)の場合、
継承した子で、新たにForm1.OnLoadに、新しいイベントを書くと、
親のイベントを実行した後、子のイベントが実行される。
デザイナーのコードを見れば、
Load += Form1_Load()
と書かれている。
子のデザイナーのコードにも、同じように書かれている。
-= なんて、記述も出来るらしい。
つまり、親を処理した後、子のイベントを処理する仕様・・・
これって、他言語だと、普通なのか?
全然、文献が出てこなかったが、
[Effective C#] 項目35 イベントハンドらよりもオーバーライドを優先する
を読んで、何となく推測し、書き直してみた。
イベントは、一番上の親に記述し、
その中で別の継承可能な関数を呼び出す。
private void Form1_Load(object sender, EventArgs e) { // OnLoad(sender, e); } public virtual void OnLoad(object sender, EventArgs e) { // 実行したい処理@親 a * 1+1 }
子にフォームでは、OnLoadにイベントを追加することなく、
public override void OnLoad(object sender, EventArgs e) { // 実行したい処理@子 a = 1 + 2; }
こうやって、Overrideするのが、正解みたい。
手間のかかることを・・・
PS.
2年前に書いたコードだが、無理矢理なコードを書いていたものだ。
一番ひどいのは、form1 から form2 にDataSourceの受け渡しがわからず、
form2のデザイナーのコード上で、form1.DataSourceを渡していた。
コンポーネントにアクセス出来なかったんだが、
private を public を変えるプロパティーを見つけ、解決。
ずいぶん、普通なコードが書けるようになったわな。