- PR -

継承フォームにてイベントの削除

1
投稿者投稿内容
くろんすき
会議室デビュー日: 2004/04/06
投稿数: 14
投稿日時: 2005-06-07 00:37
こんにちわ。いつも大変に参考にさせていただいています。
多分基本的なことだと思われるのですが、自分なりに調べた
のですが、見つけ出す事ができなかった為、大変恥ずかしい
質問ですが教えてください。
Formを継承したクラスにてイベントの削除は可能でしょうか?
つまり
Formを継承してできたFormAを更に継承しFormBを作ろうと考えていますが
FormA内にてFormのイベントを何らかの方法で削除し
FormBにてそのイベントの記述さえをできなくするという事です。
例えばFormBでForm_Clickイベント自体を記述できなくする。
事は可能でしょうか?
以上よろしくお願い致します。
ya
大ベテラン
会議室デビュー日: 2002/05/03
投稿数: 212
投稿日時: 2005-06-07 09:36
結論から言えば無理です。

例えば、AからBを継承したとしましょう。その場合、Bのインスタンスは完全にAとして振舞うことが出来る必要があります。Bであると同時にAでもなければならないのです。
ポリモーフィズムのために上書きは出来ますが、Aであることをやめる(この場合イベントの削除)は出来ません。また.NETの場合、基底クラスが上書きを明示的に許可する必要があります(C#でいうvirtual、VBだとOverridable)が、イベントアクセサは普通に実装すればoverride可能ではないので、上書きしてNotSupportedExceptionを投げるのも無理です。

以上の理由から完全な解決策はないです。ただ、デザイナとインテリセンスで表示させないようにすることは出来ます。これは、BrowsableAttribute, EditorBrowsableAttributeで指定されるので、Clickのイベントアクセサに指定してあげます。
挙げられた状況だと、以下のコードをFormAに追加すればよいです(WindowsFormsですよね?)。

コード:


[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
public new event EventHandler Click {
add { base.Click += value; }
remove { base.Click -= value; }
}



ちなみに、これを追加しても表示されなくなるだけですので、FormBでイベント追加のコードを書けばコンパイルも通ってそのように動くことになります。ただし、この上でClickイベント自体を発生させないようにすればほぼ要件を満たすのではないでしょうか(つまりFormBで追加されてもイベント自体が起きない)。
これには方法がいくつか考えられるので一例ですが、以下のような方法を思いつきました。

コード:


public class FormA : Form {
public FormA() {
this.SetStyle(ControlStyles.StandardClick, false);
}

[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
public new event EventHandler Click {
add { base.Click += value; }
remove { base.Click -= value; }
}

[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
protected override void OnClick(EventArgs e) {
base.OnClick(e);
}

protected override void OnMouseUp(MouseEventArgs e) {
if(e.Buttons==MouseButtons.Left &&
this.ClientRectangle.Contains(new Point(e.X, e.Y))) {
this.Form_Click(this, EventArgs.Empty);
}
base.OnMouseUp(e);
}

private void Form_Click(object sender, EventArgs e) {
...
}
}



一応追記しておきますが、理解してから使ってください。それなりに変なコードですから(後者のほうは特に)。そしてそのうえでその価値がないと思うなら(普通思う)すっぱりあきらめたほうがいいです。
後…VBを望んでおられたら…かけませんごめんなさい。

#後者のコード修正

[ メッセージ編集済み 編集者: ya 編集日時 2005-06-07 09:48 ]
くろんすき
会議室デビュー日: 2004/04/06
投稿数: 14
投稿日時: 2005-06-07 14:27
yaさん素早いの御回答ありがとうございます。
結構一つのイベントを無効にするのも大変ですね。
提示の方法で実装してみたいと思います。
ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)