|
Community Links |
Interessengemeinschaften |
Benutzerliste |
Foren durchsuchen |
Stichwortsuche |
Erweiterte Suche |
Uns unterstützen |
Shoppen bei Amazon |
Spende per Patreon |
Spende per PayPal |
Spende per Steady |
alle Möglichkeiten |
Gehe zu... |
![]() |
|
Themen-Optionen
![]() |
Ansicht
![]() |
![]() |
#1 (im Thread / einzeln) |
Gast
Gast
Beiträge: n/a
|
[C#]Events vererben?
Hi Leute,
ich habe ein riesengroßes Problem. Ich habe eine Basisklasse MyBaseClass mit einem Event-Member myEvent:
So bekomme ich aber eine Compiler-Fehlermeldung, daß myEvent außerhalb von MyBaseClass nur links von einem += stehen dürfe. Was hat das zu bedeuten? Sollten Events etwa nicht vererbbar sein??? |
![]() ![]() |
![]() |
#2 (im Thread / einzeln) |
Platinum Member
Registriert: 2002-02-26
Beiträge: 1.180
|
Re: [C#]Events vererben?
Bin kein Event-Experte und kann auch nichts zur Vererbung sagen, aber imho solltest du deiner Basis-Klasse noch eine Methode spendieren, die das event auslöst:
|
![]() |
![]() ![]() |
![]() |
#3 (im Thread / einzeln) |
3D-Guru
Registriert: 2001-08-08
Beiträge: 10.068
|
Re: [C#]Events vererben?
Bin kein Event-Experte und kann auch nichts zur Vererbung sagen, aber imho solltest du deiner Basis-Klasse noch eine Methode spendieren, die das event auslöst: Und das ist tatsächlich der einzige Weg, events in abgeleiteten Klassen auszulösen. |
![]() |
![]() ![]() |
![]() |
#5 (im Thread / einzeln) |
Gast
Gast
Beiträge: n/a
|
Re: [C#]Events vererben?
hm, meine derzeitige Lösung sieht so aus, daß ich in der Deklaration des Events das Schlüsselwort event weglasse:
Die Lösung mit der Methode OnMyEvent() kann eigentlich nicht funktionieren, weil: der Subscriber für das Event hat ja nur Zugriff auf eine Instanz der abgeleiteten Klasse, und muß ja über eine Anweisung wie diese:
Eine andere Lösung die ich mir überlegt habe: ich deklariere in der Basisklasse eine abstract Methode RaiseMyEvent():
Noch eine Frage zur Namenskonvention: warum nennt man eine Methode, durch die ein Event ausgelöst wird, OnEvent()? So würde ich eher eine Methode nennen, die durch das Auftreten des Events aufgerufen wird, also eine Behandlungsmethode für das Event ist, nicht eine Methode, die selbst das Event auslöst. Eine auslösende Methode würde ich eher RaiseEvent() o.ä. nennen. Entsprechend folgendem Schema:
|
![]() ![]() |
![]() |
#6 (im Thread / einzeln) |
3D-Guru
Registriert: 2001-08-08
Beiträge: 10.068
|
Re: [C#]Events vererben?
Das ist aber nur möglich, wenn myEvent Member der abgeleiteten Klasse ist, also geerbt wurde. Hier mal ein bisschen mehr zu Events: http://blog.monstuff.com/archives/000040.html Noch eine Frage zur Namenskonvention: warum nennt man eine Methode, durch die ein Event ausgelöst wird, OnEvent()? So würde ich eher eine Methode nennen, die durch das Auftreten des Events aufgerufen wird, also eine Behandlungsmethode für das Event ist, nicht eine Methode, die selbst das Event auslöst. |
![]() |
![]() ![]() |
![]() |
#7 (im Thread / einzeln) |
Gast
Gast
Beiträge: n/a
|
Re: [C#]Events vererben?
AFAIK! ist eine OnEvent Methode dazu da, zwischen dem Aufruf eines Events und dem EventHandler zu stehen. Wobei dann i.d.R. OnEvent von einer Methode - ich nenne sie mal Worker-Methode - in der selbe Klasse ausgelöst wird. OnEvent Methoden sind ja auch alle i.d.R. virtual, also überschreibbar. Rein OO Design-Technisch würde ich ja die Ereignisabbonierung über Event += Delegate(Handler) nur von außerhalb verwenden, also wenn man ein Objekt wie eine BlackBox verwendet.
Wenn ich nun aber von der Klasse erbe und auf das Geschehnis (nicht Ereignis im .NET Sinn) reagieren möchte, wäre das ja ziemlich sinnlos. In dem Fall überschreibt man dann OnEvent. Wenn du das machst, musst du aber auch innerhalb der überschriebenen Methode selbige der Basisklasse über base.OnEvent aufrufen, sofern du eventuell abbonierte Ereignisse (die also außerhalb über Event += ... abboniert wurden) ausführen lassen möchtest. Das Framework ist ja eigentlich überall von dem Shema durchsäht, vor allem die ganzen Windows Forms Klassen. |
![]() ![]() |
![]() |
#8 (im Thread / einzeln) |
Gast
Gast
Beiträge: n/a
|
Re: [C#]Events vererben?
AFAIK! ist eine OnEvent Methode dazu da, zwischen dem Aufruf eines Events und dem EventHandler zu stehen. Die OnEvent()-Methode in Elementals Lösung steht nicht dazwischen, sondern vor dem Aufruf des Events: das Event wird in der Methode ausgelöst. Wobei dann i.d.R. OnEvent von einer Methode - ich nenne sie mal Worker-Methode - in der selbe Klasse ausgelöst wird. OnEvent Methoden sind ja auch alle i.d.R. virtual, also überschreibbar. Rein OO Design-Technisch würde ich ja die Ereignisabbonierung über Event += Delegate(Handler) nur von außerhalb verwenden, also wenn man ein Objekt wie eine BlackBox verwendet. Das MyDerivedClass-Objekt selbst wird (von der EventSubscriber-Klasse) nicht als BlackBox verwendet: EventSubscriber weiß ja von dem Event-Member und abboniert diesen. Wenn ich nun aber von der Klasse erbe und auf das Geschehnis (nicht Ereignis im .NET Sinn) reagieren möchte, wäre das ja ziemlich sinnlos. Es soll aber möglich sein, das Event in einer Methode auszulösen, die MyDerivedClass von MyBaseClass geerbt hat. In dem Fall überschreibt man dann OnEvent. Das Framework ist ja eigentlich überall von dem Shema durchsäht, vor allem die ganzen Windows Forms Klassen. Was nicht der Fall ist, wenn man an zwei Phänomenen erkennen kann: 1. Windows-Messages können nur von Fenstern empfangen werden. Die Abbonenten von .NET-Events müssen aber keine Forms-Klassen sein. 2. SendMessage ist thread-sicher. Sendet man eine Windows-Message von einem Worker-Thread aus, findet ihre Verarbeitung defintiv im Hauptthread statt (in dem Thread, der das Fenster kontrolliert, an das die Message gesendet wurde). Löst man hingegen ein Event in einem Worker-Thread aus, so wird der Event-Handler ebenfalls in diesem Thread ausgeführt. Was sich z.B. dadurch bemerkbar macht, daß, wenn der Event-Handler auf GUI-Elemente zugreift, VS 2005 meckert (VS 2003 war da weniger penibel). Will man ein SendMessage erzielen, muß man Forms.Form.Invoke benutzen. |
![]() ![]() |
![]() |
#9 (im Thread / einzeln) |
Platinum Member
Registriert: 2002-02-26
Beiträge: 1.180
|
Re: [C#]Events vererben?
was soll es zwischen dem Aufruf eines Events und dem EventHandler geben? Ein Event wird ausgelöst und von einem EventHandler verarbeitet. Da gibt es nichts dazwischen. |
![]() |
![]() ![]() |
![]() |
#10 (im Thread / einzeln) |
Gast
Gast
Beiträge: n/a
|
Re: [C#]Events vererben?
was soll es zwischen dem Aufruf eines Events und dem EventHandler geben? Ein Event wird ausgelöst und von einem EventHandler verarbeitet. Da gibt es nichts dazwischen. warum eigentlich? Wenn du mit OnEvent() die Event-Auslösemethode meinst wie von Elemental beschrieben, dann reicht es doch, in MyDerivedClass einfach die geerbte OnEvent()-Methode aufzurufen, um das Event auszulösen. Dann brauche ich auch kein Ereignis im .NET Sinn auslösen. was BTW ein bißchen verwirrend ist, weil es einen bestimmten Zusammenhang zwischen den .NET-Events und den Windows-Messages der Win32-API vermuten läßt, dergestalt, daß das manuelle Auslösen eines Events intern einem SendMessage entspräche. |
![]() ![]() |
![]() |
Lesezeichen |
Ansicht |
![]() |
![]() |
![]() |
|
|