2010-12-09 2 views
0

In Java ohne Ereignisse werden Ereignisse mit Schnittstellenrückrufen nach dem Beobachtermuster modelliert. Es fällt mir auf, dass, wenn man an einem Framework mit mehr als einem halben Dutzend Events arbeitet, die Verwendung von Delegierten eine ziemlich ausführliche Übung wird.Werden callback/events auf der Basis von Schnittstellen jemals über Delegaten verwendet?

Als Java-Entwickler, der seine C# vergessen hatte, fragte ich mich, ob es jemals einen gültigen Grund gibt, Interfaces für Events zu verwenden, oder ob man Delegierte wirklich überall verwenden sollte?

Antwort

2

Wenn es immer sinnvoll ist, auf mehrere Rückrufe zu reagieren, dann wäre es potentiell sinnvoll, eine Schnittstelle zu verwenden. Möglicherweise möchten Sie jedoch einige Adaptermethoden schreiben, um die Implementierung der Schnittstelle zu ermöglichen, indem Sie Delegaten für einige der Rückrufe bereitstellen - nur die gewünschten. Diese

ist, wie Reactive Extensions Werke ... fast niemand jemals wirklich IObserver<T> implementiert - sie nutzen die IObservable<T>.Subscribe Erweiterung Methode, die der Anrufer ermöglicht, die OnNext, OnCompleted und OnError Handler über die Delegierten zu spezifizieren.

Auf diese Weise erhalten Sie die Vorteile von Delegaten (die aufgrund von Lambda-Ausdrücken usw. im Allgemeinen einfacher zu spezifizieren sind als Schnittstellen), aber auch ein konsistentes Objekt, das alle zugehörigen Rückrufe darstellt.

+0

Interessant ... aber immer noch ein wenig theoretisch für mich zu begreifen. Also, was wäre der Ansatz, Delegaten und nicht die folgende Callback-Definition verwenden: öffentliche Schnittstelle IPluginEvents { void OnLoad (IPlugin plugin); void OnShow (IPlugin-Plugin); bool CanUnload (IPlugin plugin); void OnUnload (IPlugin-Plugin); } –

+0

Nun, eine Option wäre, eine Klasse zu haben, die die Schnittstelle implementiert, die Delegaten im Konstruktor nahm ... oder möglicherweise eine fließende Schnittstelle hatte 'WithLoadHandler (...). WithShowHandler (...)' usw. wo jeder Anruf eine neue Instanz der Klasse mit dem zusätzlichen Handler erstellt. Nicht sicher. Ach ja, es könnte sogar normale Ereignisse verwenden und die Schnittstelle durch Aufruf der Event-Handler implementieren. –

0

Delegierte sind viel flexibler. Da es in C# keine anonymen Klassen gibt (im Java-Sinne), können Sie Schnittstellen nicht einfach inline implementieren. Daher muss ich, wenn eine API es erfordert, dass ich eine Schnittstelle implementiere, rausgehen und diese Klasse ausschreiben, was mich im Gegensatz zu lambdas dazu zwingt, Logik physisch weiter voneinander zu trennen, was oft die Lesbarkeit verringert.

Verwandte Themen