Laden...

[gelöst] Hilfe bei Interface Event

Erstellt von mosspower vor 16 Jahren Letzter Beitrag vor 16 Jahren 1.597 Views
mosspower Themenstarter:in
456 Beiträge seit 2007
vor 16 Jahren
[gelöst] Hilfe bei Interface Event

Hallo,

meine Lösung läuft zwar, aber ich kenne mich nicht so richtig aus und würde gerne zwei Sachen wissen.

a) Ist die Umsetzung so richtig, gehe ich richtig vor? Ich habe noch nicht so viel Erfahrung mit Events und / oder Delegates
b) Wie kann ich in der Impl-Klasse beim Invoke verhindern, dass eine Dummy-Methode aufgerufen, bzw. registriert wird, die wäre in meinem Fall unnütz.

OK, hier der Sachverhalt

  1. Interface ...
namespace Betfair.MarketMonitor {
  /// <summary>
  /// Delegate for a change on an exchange market
  /// </summary>
  /// <param name="exchangeMarket">The ExchangeMarket object</param>
  public delegate void OnChange(ExchangeMarket exchangeMarket);

  interface IMarketMonitor {
    /// <summary>
    /// Event will be raised after any change on the ExchangeMarket object
    /// </summary>
    event OnChange OnChange_Event;

    
    void Process();
  }
}

  1. Eine Impl.-Klasse ...
namespace Betfair.MarketMonitor {
  /// <summary>
  /// Watches markets from the betfair web site
  /// </summary>
  class ExternMarketMonitor : IMarketMonitor {
    private long marketId = long.MinValue;
    
    // All available events
    public event OnChange OnChange_Event;

    /// <summary>
    /// Public constructor
    /// </summary>
    /// <param name="marketId">The market id</param>
    public ExternMarketMonitor(long marketId) {
      this.marketId = marketId;
      // ????????????????????????
      this.OnChange_Event += new OnChange(TestImpl);
      // ????????????????????????
    }

    public void TestImpl(ExchangeMarket exchangeMarket) {
      // Why this empty method ???
    }

    public void Process() {
      this.OnChange_Event.Invoke(null);
    }
  }
}
  1. Client
static void Main() {
      try {
        IMarketMonitor marketMonitor = new ExternMarketMonitor(234);
        marketMonitor.OnChange_Event += new OnChange(TestExtern);
        marketMonitor.Process();

So, das funktioniert wunderbar, die Methode TestExtern wird aufgerufen, nur möchte ich noch viele Ereignisse einbauen, muss ich da jedesmal so eine "Pseudozuweisung" (this.OnChange_Event += new OnChange(TestImpl);
) machen und jedesmal eine leere Methode schreiben? Geht das nicht einfacher .. kann man anstatt des Invoke auch etwas anderes verwenden, denn die "Kette" der Methoden besteht eigentlich immer aus einer Methode und nicht wie in dem Beispiel aus zwei Methoden, wobei eine einfach nur eine Hülle ist.

Danke schon mal für Hilfe. Ich hoffe, dass ich mein Problem einigermaßen verständlich rübergebracht habe.

2.187 Beiträge seit 2005
vor 16 Jahren

Morgen,

Dein Vorgehen ist falsch. Es gibt einen Dokumentation in der MSDN, ich bin aber zu faul den Link zu suchen, also hier der Code 😁 :


public class ChangeEventArgs : EventArgs // Entspricht deiner "ExchangeMarket"-Klasse
{...}

public delegate void ChangeEventHandler(object sender, ChangeEventArgs e);

public interface IMarketMonitor
{
  event ChangeEventHandler Changed;
}

public class MarketMonitor
{
  public event ChangeEventHandler Changed;

  protected virtual OnChanged(ChangeEventArgs e)
  {
    if(this.Changed!=null)
    {
      this.Changed(this,e);
    }
  }

  public void Prozess()
  {
    this.OnChanged(new ChangeEventArgs(...));
  }
}

Du solltest mal die MSDN-Sektion über Bennenungsrichtlinien lesen.

Gruß
Juy Juka

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo mosspower,

siehe auch [FAQ] Eigenen Event definieren.

herbivore

mosspower Themenstarter:in
456 Beiträge seit 2007
vor 16 Jahren

@JuyJuka, @herbivore,

vielen Dank für eure Antworten, werde ich gleich umbauen. Super Forum hier 👍