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?
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.
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:
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.
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.
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.
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.
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: Ссылка