2009-03-18 4 views
22

私はButtonのサブクラスを作成しており、OnClickなどのイベントにカスタム機能を追加したいと考えています。それはもっと望ましい方法ですか?イベントハンドラの使用とイベント発生メソッドのオーバーライド

protected override void OnClick(EventArgs e) 
{ 
    base.OnClick(e); 
    doStuff(); 
} 

または私が代わりにデザイナーを通じて私のボタンのサブクラスで定義されたイベントハンドラにOnClickイベントをリンクする必要があります私は、クリック時に上書きしますか?

class ButtonSubclass 
{ 
    public ButtonSubclass() : base() 
    { 
     InitializeComponent(); 
    } 

    private void InitializeComponent() 
    { 
     this.Click += new System.EventHandler(this.ButtonSubclass_Click); 
    } 
} 

編集:私はマイナーな視覚的な変更を追加した(つまりとして初歩的なスキンを通過してもよい)が、変化のほとんどは、私が再実装(コピー&ペースト)したくないイベントハンドラ内にあるすべての上それを再利用するフォーム。

答えて

26

ボタンを本当に専門にしている場合は、OnClickを無効にすると効果的です。 の場合、実際にはボタンをクリックしたときの動作が変更されますが、最初はButtonをサブクラス化しません。イベントハンドラを追加します。

EDIT:ちょっとだけ考えてみましょう。複数のボタンに似たイベントハンドラを追加したい場合は、それを行うためのユーティリティメソッドを記述して複数の場所から呼び出すのは簡単です。実際のサブクラス化を必要としません。もちろんサブクラスであることは間違いありません。もちろん、あなたに余分なオプションを与えるだけです。

+1

この文脈で "専門化"を定義できますか? – MasterMastic

+0

@Ken:それはいくつかの真に*異なる*方法で動作します。すべてのハンドラを逆の順序で実行します。 「常に特定のハンドラを持つボタン」だけではありません。 –

+0

意味があります、ありがとうJon! :) – MasterMastic

8

継承時に常にOnClickをオーバーライドします。それはより良いパフォーマンスを提供します。

+4

パフォーマンスは、影響が重要であることが判明するまでは、ほとんどの場合、読みやすさを第二に考慮する必要があります。私はパフォーマンスの差がここでは重要ではないと信じています(これは非常に小さく、ここではボタンクリック*、つまり比較的まれなイベントです)。 –

+0

私は、OnClickを無効にすることが間違っていると言っているわけではありません - そのパフォーマンスだけがそれを行う理由ではありません。 –

+0

1つの余分なイベントハンドラーのパフォーマンスは少しばかげている – RvdK

-2

ボタンをクリックすると、私はそれを読み方としてそのまま残しています。しかし、私は個人的な好みのことだと思う。私は、コンセンサスが何であるかを見ることに興味があります。

0

実際には、メソッドオーバーライドにイベントハンドラを付加する利点があります。イベントハンドラはプライベートですが、オーバーライドされたメソッドはである必要があります。の名前は事前定義されています。あなたのアプリケーションを保護するために難読化/暗号化ツールを使用する場合、protected overrideのコードはprivateよりも公開されます。

関連する問題