Ereignisse gegen überschreibbare Methoden?

8

Kann mir jemand allgemeine Richtlinien geben, wann ich übersteuerbare Methoden wie "OnMyEvent" verwenden sollte und wann ich Ereignisse wie "MyEvent" in C # verwenden soll?

Gibt es allgemeine Designprinzipien, die definieren können, was zu verwenden ist?

    
Mathias Lykkegaard Lorenzen 31.07.2011, 03:26
quelle

2 Antworten

6

Ereignisse sind großartig, wenn Sie ein "hat ein" haben, während Überschreibungen in Situationen, in denen Sie eine "ist a" Beziehung haben, viel besser sind

Wenn Sie zum Beispiel ein Tier der Basisklasse haben, ist es wahrscheinlich, dass jedes Tier seine eigene Art der Bewegung hat. aber jedes Tier wird sich irgendwie bewegen wollen.

Denken Sie jetzt an eine Klassenperson, die ein Haustier haben kann. in diesem Fall könnte die Person auf das sich bewegende Tier reagieren, aber es würde nicht wirklich mit der Bewegung des Tieres umgehen.

    
tam 31.07.2011, 03:31
quelle
7

Die beiden Merkmale sind vage ähnlich (beide sind so konzipiert, dass sie dynamisch ablaufen), sind aber nicht direkt vergleichbar.

Ereignisse sollen anderen Objekten mitteilen, dass ein Objekt zu einer Art Zustandsübergang gekommen ist. Es ist ein Sprachfeature, das das Observer Design Pattern enthält. Dies kann in vielen Fällen nützlich sein, ist aber nicht immer nützlich oder wünschenswert. Es ist ein Werkzeug, um bestimmte Aufgaben zu erledigen.

Virtuelle Funktionen werden verwendet, um Object Oriented Polymorphism zu erstellen. Sie sind ein Grundbaustein für fast jedes Designmuster und eine Menge objektorientierten Designs.

Um zu versuchen, sie zu vergleichen, nehme ich an, dass Sie versuchen, eine Art von Beobachtermuster mit beiden Funktionen zu implementieren. Mit dieser Einschränkung gibt es immer noch keine einfache Regel, auf die Sie zurückgreifen können, um zu entscheiden, welche Sie verwenden sollten. Stattdessen müssen Sie sich Fragen stellen wie:

  • Wer hat es verursacht? Tritt die Aktion, die Ihren Statusübergang auslöst, intern auf oder wird sie extern ausgelöst?

Wenn es intern ausgelöst wird, können Sie ein Ereignis oder eine virtuelle Methode verwenden. Wenn es extern ausgelöst wird, müssen Sie eine virtuelle Methode verwenden.

  • Wen kümmert es: Soll die Klasse, die den Status definiert, mit den Konsequenzen des Zustandsübergangs umgehen oder sollte eine externe Klasse damit umgehen?

Wenn die Klasse, die den Status besitzt, den Übergang behandeln soll, sollte es eine virtuelle Methode sein. Wenn eine separate Klasse auf den Übergang reagieren soll, sollte es ein Ereignis sein.

  • Wie viele Handler brauche ich: Brauchen Sie immer einen Handler, um auf den Statuswechsel zu reagieren, oder brauchen Sie viele?

Wenn Sie eine benötigen, kann entweder eine virtuelle Methode oder ein Ereignis verwendet werden. Wenn Sie viele benötigen, wird es viel einfacher sein, ein Ereignis zu verwenden.

  • Kenne ich den zum Zeitpunkt der Kompilierung gewünschten Handler: Binde ich mich an einen einzelnen bekannten Handler oder binde ich an unbekannte Handler, die sich möglicherweise im Laufe der Zeit ändern?

Wenn Sie Ihre Handler ändern müssen, müssen Sie Ereignisse verwenden. Wenn Sie nur einen einzigen Handler haben, der zur Kompilierungszeit bekannt ist, können Sie eine virtuelle Methode verwenden.

  • Wie verbunden sollte mein Code sein: Gehört Ihr Handler-Code zu einer abgeleiteten Klasse Ihres ursprünglichen Typs oder gehört er woanders hin?

Wenn es zu einer abgeleiteten Klasse gehört, benötigen Sie eine virtuelle Methode. Wenn es woanders hingehört, dann brauchst du ein Event.

Wie Sie sehen, hängen die Antworten stark von Ihrer spezifischen Problemdomäne und Objektarchitektur ab. Gutes Design ist nicht etwas, das über eine Checkliste magisch in deinen Schoß fällt. Du musst viel darüber nachdenken:)

Bearbeiten:

Es ist möglicherweise nicht direkt auf C # -Ereignisse anwendbar, aber es kann nützlich sein, ein Beispiel aus einer bestehenden Arbeit zu nehmen. Hier ist ein kurzer Artikel, den ich gerade (bei der Beantwortung einer anderen Frage) über Designalternativen in Java für Vielseitigkeitsmuster gefunden habe: Ссылка

    
Merlyn Morgan-Graham 31.07.2011 03:59
quelle

Tags und Links