2009-03-18 12 views
22

Ich erstelle eine Unterklasse von Button und möchte einigen Ereignissen wie OnClick benutzerdefinierte Funktionen hinzufügen. Welcher ist der wünschenswerteste Weg, es zu tun? Ich überschreiben Beim Klicken:Verwenden von Ereignishandlern und Überschreiben von Ereignisauslösemethoden

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

oder sollte ich stattdessen das OnClick Ereignis an einen Ereignishandler in meinem Button-Unterklasse durch den Designer definiert verknüpfen?

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

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

bearbeiten: Ich habe kleinere optische Veränderungen (das als rudimentäre Häutung passieren kann), aber die meisten Änderungen sind in Ereignishandler ab, ich will nicht (copy-paste) auf jeder neu implementieren Form, die es wiederverwendet.

Antwort

26

Wenn Sie wirklich auf die Schaltfläche spezialisiert sind, ist es sinnvoll, zu überschreiben. Wenn Sie nur tatsächlich ändern, was passiert, wenn eine Schaltfläche geklickt wird, würde ich nicht Button an erster Stelle - ich würde nur hinzufügen Ereignishandler.

EDIT: Nur um ein bisschen mehr von einer Idee - wenn Sie ähnliche Event-Handler für mehrere Schaltflächen hinzufügen möchten, ist es einfach genug, eine Hilfsmethode zu schreiben, um dies zu tun, und rufen Sie von mehreren Orten. Es erfordert keine tatsächliche Unterklasse. Das heißt nicht, dass Unterklasse ist definitiv falsch in Ihrem Fall natürlich - nur geben Sie zusätzliche Optionen :)

+1

Können Sie in diesem Zusammenhang "spezialisiert" definieren? – MasterMastic

+0

@Ken: Es auf eine wirklich * andere * Weise, z. Ausführen aller Handler in umgekehrter Reihenfolge. Nicht nur "ein Knopf, der immer einen bestimmten Handler hat". –

+0

Macht Sinn, danke Jon! :) – MasterMastic

8

Überschreiben Sie OnClick immer, wenn Sie erben. Es gibt Ihnen bessere Leistung.

+4

Die Leistung sollte in den meisten Fällen von untergeordneter Bedeutung für die Lesbarkeit sein, bis sich die Auswirkung als signifikant erwiesen hat. Ich glaube nicht, dass der Unterschied in der Leistung hier signifikant ist (es ist ziemlich klein, und wir reden hier * Tastenklicks *, d. H. Relativ seltene Ereignisse). –

+0

Ich sage nicht, dass das Überschreiben von OnClick falsch ist - nur dass die Leistung nicht der Grund dafür ist. –

+0

Leistung für 1 extra Eventhandler ist ein bisschen lächerlich – RvdK

-2

Für einen Knopf klicken, würde ich es als eine Methode zum Lesen halten. Aber ich denke, es ist eine persönliche Vorliebe Sache. Ich wäre interessiert, was der Konsens ist.

0

Tatsächlich gibt es einen Vorteil des Anhängens eines Ereignishandlers über das Überschreiben einer Methode. Ihr Ereignishandler ist privat, während Ihre überschriebene Methode geschützt mit einem vordefinierten Namen sein muss. Wenn Sie Verschleierungstools verwenden, um Ihre Anwendung zu schützen, wird Ihr Code mehr angezeigt, wenn er protected override ist als wenn private.

Verwandte Themen