Entspricht der Java anonyme Klassen in C#?
Ich versuche port ein SDK in java geschrieben, mit C#.
In dieser software gibt es viele "handler" - Schnittstellen mit mehreren Methoden (zum Beispiel: attemptSomethingHandler
mit success()
und verschiedene Methoden Versagen). Diese Schnittstelle wird dann implementiert und instanziiert ist anonym innerhalb der aufrufenden Klasse und übergeben die attemptSomething
Methode der SomethingModel
Klasse. Dies ist eine asynchrone Methode und hat mehrere Orte, an denen es scheitern könnte oder ruft eine andere Methode (Weitergabe der Hundeführer). Auf diese Weise, die anonyme Implementierung von attemptSomethingHandler
verweisen können private Methoden in die Klasse, ruft attemptSomething
.
In C# ist es nicht möglich, anonym eine Schnittstelle implementieren. Ich könnte explizit implementieren Sie eine neue Klasse, aber diese Umsetzung wäre eindeutig zu diesem aufrufenden Klasse und nicht für irgendetwas anderes. Noch wichtiger ist, ich würde nicht in der Lage sein, um Zugriff auf die privaten Methoden der aufrufenden Klasse, die ich brauchen und nicht wollen, öffentlich zu machen.
Grundsätzlich, ich brauche, um mit verschiedenen code aus der aufrufenden Klasse je nachdem, was passiert in der SomethingModel
- Klasse Methoden.
Ich gelesen habe bis auf die Delegierten aber dies würde erfordern, vorbei an so viele Delegierte, wie es Methoden in der hf-Schnittstelle (soweit ich das sagen kann).
Was ist der geeignete Weg, dies zu tun in C#? Ich fühle mich wie ich bin nicht auf eine sehr Allgemeine programming-Strategie. Es muss einfach eine einfache, saubere Art und Weise zu strukturieren und zu lösen dieses problem.
- Vielleicht lohnt es sich, zur illustration Ihrer Frage mit den java-code, den Sie versuchen zu port, und Ihren Versuch so weit?
- Ihre Frage ist unklar, so dass ich nicht VTC es noch nicht, aber möchten Sie vielleicht check out stackoverflow.com/questions/191013/...
- Könnte man implementieren Sie die Schnittstelle in eine innere Klasse. Auf diese Weise KÖNNEN Sie den Zugriff auf die privaten Mitglieder der aufrufenden Klasse.
- Es klingt fast so, wollen Sie eine private geschachtelte Klasse.
- Viele Fälle von anonymen Typen in Java kann ersetzt werden durch Ereignisse oder Lambda-Ausdrücke in C#.
- Sie kann ein compiler
Du musst angemeldet sein, um einen Kommentar abzugeben.
In C#, haben wir nicht anonyme Typen wie Java per se. Können Sie einen anonymen Typ, der die Felder enthält, etwa so:
var myObject = new { Foo = "foo", Bar = 1, Quz = 4.2f }
Jedoch diese nicht haben Methoden aufgestellt, die in Ihnen und sind nur passierbar, in Methoden, die durch die Nutzung der
object
oderdynamic
(denn Sie haben keinen Typ zur compile-Zeit, Sie werden vom compiler generiert AFAIK)Statt in C# verwenden wir, wie Sie sagten, Delegierten-oder Lambda-Ausdrücke.
Wenn ich verstehe deine Gurke richtig, Sie könnte Implementierung einer geschachtelten private Klasse in etwa so:
Nun
MyClass
erstellen eine Instanz derMyInterface
implementiertIMyInterface
. Als commentors erwähnt habe, ist dieMyInterface
zugreifen können MitgliederMyClass
(obwohl Sie sicherlich wollen, um zu versuchen und bleiben, um mit öffentlich zugänglichen Mitglieder der beiden Typen).Diese kapselt die "anonymous" - Klasse (mit Java-Bezug hier, um es einfacher zu machen) und bedeutet auch, dass Sie möglicherweise zurück
MyInterface
alsIMyInterface
und der rest der software würden nicht klüger sein. Dies ist tatsächlich, wie einige abstrakte-Fabrik-Muster arbeiten.Das riecht nach schwere Kupplung. Oh dear!
Es klingt für mich wie Ihr bestimmtes problem verwenden könnte, refactoring. In C# kann Ereignisse verwenden, um dieses Problem zu lösen (bitte beachten: Kann, nicht sollte). Nur ein Ereignis für jedes "branch" - Punkt der Methode. Aber ich muss sagen das macht Ihre Lösung schwieriger ins Auge zu fassen und zu pflegen.
Aber ich schlage vor, Sie die Architektur Ihrer Lösung in einer Weise, dass Sie nicht so schwere Kupplung so.
Könnte man auch versuchen, ein Pipeline-Modell, aber ich bin mir nicht sicher, wie die Umsetzung selbst. Ich weiß, dass der jetty (oder ist es Netty? der NIO für Java, JBOSS) sicherlich verwendet ein ähnliches Modell.
Können Sie feststellen, dass das werfen einige unit-tests zum testen der erwarteten Funktionalität der Klasse wird es einfacher, die Architektur Ihrer Lösung (TDD).
Verwendung von Stellvertretern:
Oder, mit einem Klasse
Oder Ereignisse
Können Sie geschachtelte Klassen zu simulieren, anonyme Klassen, sondern um die Verwendung geschachtelter Klassen in derselben Weise wie Java-Sie müssen übergeben Sie einen Verweis auf die äußere Klasse. In Java werden alle verschachtelten und anonymen Klassen haben dies standardmäßig, und nur der statische nicht.
OuterClass.this
.OuterClass.this
.