myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Rund um die Programmierung » best practise: Event einer aggregierten Klasse weiterleiten
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

best practise: Event einer aggregierten Klasse weiterleiten

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
tabstop tabstop ist männlich
myCSharp.de-Mitglied

Dabei seit: 21.10.2007
Beiträge: 94
Entwicklungsumgebung: Visual Studio 2010


tabstop ist offline

best practise: Event einer aggregierten Klasse weiterleiten

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Ich frage mich, was der beste Weg ist, ein Event einer aggregierten Klasse weiterzuleiten. Dazu folgender Code (KlasseA soll von aussen benutzt werden):

C#-Code:
public class KlasseB
{
  public event EventHandler EventVonB;

  public void DoSomething()
  {
    OnEventVonB();
  }

  protected virtual void OnEventVonB()
  {
    EventHandler tmp = EventVonB;
    if (tmp != null)
    {
      tmp(this, new EventArgs());
    }
  }
}

C#-Code:
public class KlasseA
{
  private KlasseB klasseB;

  public event EventHandler EventVonA
  {
    add { this.klasseB.EventVonB += value; }
    remove { this.klasseB.EventVonB -= value; }
  }

  public KlasseA()
  {
    this.klasseB = new KlasseB();
  }

  public void DoSomethingWithB()
  {
    this.klasseB.DoSomething();
  }
}

Wie macht ihr das? Insbesondere, falls noch eine KlasseC hinzukäme, die in KlasseB benutzt wird und man möchte das Event von KlasseC verfügbar machen.

Alternativ hätte ja auch KlasseA das Event von KlasseB abonnieren können und dieses durchreichen können. Nur würde ich am liebsten die ganze Aufrufkette so klein wie möglich halten.
22.09.2011 15:59 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Alf Ator
myCSharp.de-Mitglied

avatar-586.gif


Dabei seit: 30.10.2007
Beiträge: 586
Entwicklungsumgebung: VS2005 / VS2008


Alf Ator ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Wie praktisch. Du ersparst mir, diese Frage zu stellen.

Also ich habs bisher durchgereicht bis zur Klasse C. Glaube aber nicht so recht, dass das best practise ist.
22.09.2011 16:27 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
inflames2k inflames2k ist männlich
myCSharp.de-Poweruser/ Experte

avatar-3407.gif


Dabei seit: 03.01.2010
Beiträge: 2.198
Entwicklungsumgebung: Visual Studio 2010 Express


inflames2k ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Also mir ist nur die Möglichkeit bekannt, das Event von innen nach außen zu reichen.

Ich habe bisher noch keine Andere Lösung gesehen. Falls dennoch jemand eine bessere Lösung kennt wäre ich auch interessiert an dieser.
22.09.2011 16:44 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Alf Ator
myCSharp.de-Mitglied

avatar-586.gif


Dabei seit: 30.10.2007
Beiträge: 586
Entwicklungsumgebung: VS2005 / VS2008


Alf Ator ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

und wie machst du das bei 3 klassen?

klasseC -> klasseB -> klasseA

oder irgendwie klasseC --> klasseA
22.09.2011 16:49 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
inflames2k inflames2k ist männlich
myCSharp.de-Poweruser/ Experte

avatar-3407.gif


Dabei seit: 03.01.2010
Beiträge: 2.198
Entwicklungsumgebung: Visual Studio 2010 Express


inflames2k ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Ich reiche es der Hierarchie nach durch.

also eben KlasseC -> Klasse B - > Klasse A

Klasse C -> Klasse A würde bedeuten, dass Klasse A Klasse C kennt, oder Klasse C öffentlich über Klasse B zugänglich ist. Und beides wäre ja wiederum nicht wirklich sauber.
22.09.2011 16:54 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Grumbler85 Grumbler85 ist männlich
myCSharp.de-Mitglied

Dabei seit: 13.05.2008
Beiträge: 538
Entwicklungsumgebung: VS 2010
Herkunft: Rheingau Taunus


Grumbler85 ist offline Füge Grumbler85 Deiner Kontaktliste hinzu

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Durch das durchreichen hebelst du aber das private aus.
Du kannst nun nämlich beim Event den sender speichern und zugreifen, obwohl er private war.

Das kannst du verhindern, indem du das Event aus B in A abbonnierst und damit dann ein eigenen Event in A feuerst.
Das wiederum hat den Vorteil, dass du das Event aus B austauschen kannst, ohne was an Klassen, die A nutzen ändern zu müssen.
22.09.2011 17:00 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
inflames2k inflames2k ist männlich
myCSharp.de-Poweruser/ Experte

avatar-3407.gif


Dabei seit: 03.01.2010
Beiträge: 2.198
Entwicklungsumgebung: Visual Studio 2010 Express


inflames2k ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Falls du dich damit auf meine Aussage stützt. Ich meinte eher folgendes:

C#-Code:
class KlasseA
{
     private KlasseB _klasseB = new _klasseB();

     public event EventHandler SomeEvent;

     public KlasseA()
     {
         this._klasseB.SomeEvent += new EventHandler(SomeHandler);
     }

     private void SomeHandler(Object sender, EventArgs e)
     {
             if(SomeEvent != null)
                  SomeEvent(this, e);
     }
}

class KlasseB
{
     private KlasseC _klasseC = new _klasseC();

     public event EventHandler SomeEvent;

     public KlasseB()
     {
         this._klasseC.SomeEvent += new EventHandler(SomeHandler);
     }

     private void SomeHandler(Object sender, EventArgs e)
     {
             if(SomeEvent != null)
                  SomeEvent(this, e);
     }
}

class KlasseC
{
     public event EventHandler SomeEvent;

     public SomeMethod()
     {
           // some code

          if(SomeEvent != null)
               SomeEvent(this, EventArgs.Empty);
     }

}
22.09.2011 17:56 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
gfoidl gfoidl ist männlich
myCSharp.de-Team

avatar-2894.jpg


Dabei seit: 07.06.2009
Beiträge: 6.548
Entwicklungsumgebung: VS 2019
Herkunft: Waidring


gfoidl ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo,

dieses "Bubbling" ist schon die best practice.
Passend dazu:  Event weitergeben über mehrere Applikationsschichten

mfG Gü
22.09.2011 20:14 Beiträge des Benutzers | zu Buddylist hinzufügen
ujr
myCSharp.de-Poweruser/ Experte

Dabei seit: 24.11.2007
Beiträge: 1.688


ujr ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo,

s. auch  Ausführung ohne Dispatcher-Instanz an den GUI-Thread delegieren ff bzgl. "Konvention" - entscheidend ist eben, dass der "oberste" Aufrufer mit dem "sender" aus den unteren Klassen i. allg. nichts anfangen kann/darf und diesen auch gar nicht kennen sollte (Implementierungsdetails können sich ändern).
23.09.2011 08:42 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
herbivore
myCSharp.de-Poweruser/ Experte

avatar-2627.gif


Dabei seit: 11.01.2005
Beiträge: 49.461
Entwicklungsumgebung: csc/nmake (nothing is faster)
Herkunft: Berlin


herbivore ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo zusammen,

in dem verlinkten Thread ( Ausführung ohne Dispatcher-Instanz an den GUI-Thread delegieren) ist es etwas verstreut und es geht dort auch noch um anderen Themen. Daher hier die relevantem Infos zusammengefasst:

Zitat von herbivore:
Der EventHandler muss für genau das Objekt registriert sein, für das der Event ausgelöst wird.

Um einen Event ins GUI [bzw. allgemeiner gesprochen zum letztlichen Empfänger] zu bekommen, kann es nötigt sein, dass zwischengeschaltete Objekte den ursprünglichen Event fangen und dann selbst einen eigenen Event auslösen.

Zitat von herbivore:
Wie umständlich das [bei mehreren Stufen] ist, hängt davon ab, von wievielen unterschiedlichen Klassen die Objekte sind. Wenn es nur eine Klasse ist, braucht man vom Code her nur einen Event zu schreiben, auch wenn der zur Laufzeit zehnmal von Objekt zu Objekt gefeuert wird.

Zitat von herbivore:
Zwar könnte man über diese Syntax [ Event Accessors] im Prinzip einen EventHandler, der für das übergeordnete Objekt registriert wird, bei einem untergeordneten Objekt registrieren, so dass ein im untergeordneten Objekt gefeuerter Event ohne Umwege beim EventHandler ankommt, aber stimmt dann leider der sender-Parameter nicht mit dem überein, was der EventHandler erwarten darf. Der erwartet ja als Sender das Objekt, bei dem er den Event registriert hat, es kommt aber ein Objekt, welches er überhaupt nicht kennt [und welches normalerweise gar nicht bekannt sein soll]. Daher verbietet sich diese Vorgehensweise.

Zitat von herbivore:
Ob das [dass der Sender immer das Objekt sein muss, bei man den Event registriert hat] jetzt irgendwo explizit als Regel steht, weiß ich nicht, aber eine Konvention ist es auf jeden Fall. Als sender kommt nur das Objekt in Betracht, bei dem man den Event abonniert hat. Das kann man z.B. in Windows Forms sehen: Wenn du im Form KeyDown abonnierst und KeyPreview auf true setzt und dann in einer TextBox auf dem Form Text eingibst, dann ist der Sender das Form und nicht die TextBox, denn man hat ja das Event des Forms und nicht das der TextBox abonniert.

Ob es praktisch wäre, die tatsächliche Quelle zu erfahren, steht auf einem anderen Blatt und hängt auch von den genauen Umständen ab. Wenn der sender z.B. eine interne oder private Klasse ist, wäre die Bekanntgabe mindestens ungünstig, wenn nicht sogar schädlich. In dem KeyPreview-Beispiel könnte es dagegen schon praktisch sein, die tatsächliche Quelle zu kennen. Aber das müsste man dann wirklich über die EventArgs machen.

herbivore

Suchhilfe: 1000 Worte, Event, Events, Ereignis, Ereignisse, weiterleiten, Weiterleitung, weitergeleitet, weitergeleitete, durchreichen, durchgereicht, durchgereichte, route, routen, routing, verschachtelt, verschachtelte, verschachteln, Verschachtelung, geschachtelt, geschachtelte, kaskadiert, kaskadierte, kaskadieren, Kaskade, verkettet, verkettete, verketten, Kette, durchschleifen, durchgeschleift
23.09.2011 09:02 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 7 Jahre.
Der letzte Beitrag ist älter als 7 Jahre.
Antwort erstellen


© Copyright 2003-2019 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 19.08.2019 16:03