Wie Sie Kraft Konstruktor-Signaturen und statische Methoden?
Gibt es eine Möglichkeit zu zwingen, einen (Kinder -) Klasse die Konstruktoren mit bestimmten Signaturen oder insbesondere statische Methoden in C# oder Java?
Können Sie nicht offensichtlich die Verwendung von Schnittstellen für dieses, und ich weiß, dass es eine begrenzte Verwendung. Eine Instanz, in der ich finde es nützlich ist, wenn Sie erzwingen möchten einige design-Richtlinie, zum Beispiel:
Ausnahmen
Sie alle haben die vier kanonischen Konstruktoren, aber es gibt keine Möglichkeit es durchzusetzen. Sie haben, verlassen Sie sich auf Tools wie FxCop C# - Fall) zu fangen, diese.
Betreiber
Es gibt keinen Vertrag, der angibt, dass zwei Klassen zusammengefaßt werden (mit dem operator " + " in C#)
Gibt es design-pattern um diese Einschränkung zu umgehen?
Was konstruieren könnte Hinzugefügt werden, um die Sprache um diese Einschränkung zu überwinden, in zukünftige Versionen von C# oder Java?
InformationsquelleAutor der Frage Sklivvz | 2008-10-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nicht erzwungen werden zur compile-Zeit, aber ich habe viel Zeit damit verbracht, auf der Suche auf ähnliche Probleme; ein Generika-fähigen Mathe-Bibliothekund eine effiziente (nicht-Standard) ctor-API sind beide verfügbar in MiscUtil. Diese sind jedoch nur überprüft, bei der ersten Verwendung zur Laufzeit. In der Realität ist dies nicht ein großes problem - Ihre unit-tests finden sollten Sie alle fehlenden operator /ctor sehr schnell. Aber es funktioniert, und das sehr schnell...
InformationsquelleAutor der Antwort Marc Gravell
Die Verwendung von Generika können Sie erzwingen, dass ein typargument, um eine parameterlose Konstruktor - aber das ist über die Grenze.
Andere als im Bereich der Generika, es würde schwierig sein, tatsächlich verwenden diese Einschränkungen auch, wenn es Sie gibt, aber es könnte manchmal nützlich sein, für Typ Parameter/Argumente. Ermöglicht statische member in interfaces (oder möglicherweise statische Schnittstellen) könnte ebenfalls helfen, mit den "generischen numerischen operator" - Problem.
Ich darüber schrieb vor einer Weile, wenn Sie vor einem ähnlichen problem.
InformationsquelleAutor der Antwort Jon Skeet
Können Sie das Factory-pattern.
Dann könnten Sie Klassen erstellen, die für jede Art von Obst
Diese nicht erzwingen, Sie können nicht erstellen Sie eine Instanz in einer anderen Weise als über das Werk, aber zumindest können Sie angeben, welche Methoden, die Sie auffordern würde, aus einer Fabrik.
InformationsquelleAutor der Antwort jrudolph
Kraft Konstruktoren
Können Sie nicht. Der nächstgelegene Sie kommen können, ist der Standard-Konstruktor private und geben Sie dann einen Konstruktor, der Parameter hat. Aber es hat noch Lücken.
InformationsquelleAutor der Antwort jop
Das problem in der Sprache ist, dass statische Methoden sind wirklich Bürger zweiter Klasse (Ein Konstruktor ist auch eine Art statische Methode, weil Sie nicht brauchen, eine Instanz zu starten mit).
Statischen Methoden sind nur Globale Methoden mit einem Namensraum, die Sie nicht wirklich "gehören" der Klasse, die Sie definiert sind (OK, Sie haben Zugang zu einem privaten (static) Methoden in der Klasse, aber das ist über es).
Das problem auf der compiler-Ebene ist, die ohne eine Instanz der Klasse Sie nicht über eine virtuelle Funktionstabelle, was bedeutet, dass Sie nicht alle die Vererbung und Polymorphie Zeug.
Ich denke, man könnte damit es funktioniert, indem eine Globale/statische virtuelle Tabelle für jede Klasse, aber wenn es noch nicht fertig noch, gibt es wahrscheinlich einen guten Grund dafür.
InformationsquelleAutor der Antwort TToni
Hier ist würde ich es lösen wenn ich eine Sprache-designer.
Ermöglichen Schnittstellen zu enthalten statische Methoden, Operatoren und Konstruktoren.
Nicht zulassen, dass der entsprechende
new IFoo(someInt)
oderIFoo.Bar()
Ermöglichen Konstruktoren vererbt zu werden (genau wie bei statischen Methoden).
Erlauben es dem Programmierer zu werfen, um Schnittstellen und überprüfen, wenn notwendig, zur Laufzeit, ob der cast ist semantisch gültig, auch wenn die Klasse nicht explizit angeben.
InformationsquelleAutor der Antwort Sklivvz
Leider kann man nicht in C#. Hier ist ein Durchschlag an ihm aber:
InformationsquelleAutor der Antwort Jonathan C Dickinson
Gut, weiß ich aus der Formulierung Ihrer Frage, die Sie suchen, compile-time enforcement. Es sei denn, jemand anderes hat einen Brillanten Vorschlag/hack, die Ihnen erlauben, dies zu tun die Weise, die Sie implizieren, der compiler sollte, würde ich vorschlagen, dass Sie schreiben konnte, eine benutzerdefinierte MSbuild-task, der dies Tat. Eine AOP-Frameworks wie PostSharp könnte Ihnen helfen, dieser an comiple-Zeit durch piggy-backing auf es zu bauen task-Modell.
Aber was ist falsch mit code-Analyse-oder run-time-enforcement? Vielleicht ist es nur Vorlieben und ich respektiere das, aber ich persönlich habe keine Probleme mit CA/FXCop überprüfen Sie diese Dinge... und wenn Sie wirklich wollen, zu zwingen, downstream-Implementierer von Ihren Klassen zu haben-Konstruktor-Signaturen sind, können Sie immer fügen Sie Regeln run-time-Prüfung in der Basis-Konstruktor der Klasse mit der spiegelung.
Richard
InformationsquelleAutor der Antwort ZeroBugBounce
Ich bin nicht sicher, was Sie versuchen zu erreichen, können Sie bitte erläutern? Der einzige Grund für das erzwingen einer bestimmten Konstruktor oder eine statische Methode in verschiedenen Klassen ist zu versuchen, und führen Sie Sie dynamisch zur Laufzeit, ist das richtig?
Einen Konstruktor vorgesehen ist, das an eine bestimmte Klasse, so wie es bestimmt ist, zu initialisieren, die den spezifischen Bedürfnissen der Klasse. Wie ich es verstehe, der Grund, warum Sie wollen würde, zu erzwingen, etwas in einer Hierarchie der Klasse oder eine Schnittstelle ist, dass es eine Tätigkeit bzw. einen Vorgang relevant für den Prozess durchgeführt werden, kann aber variieren in verschiedenen Situationen. Ich glaube, dies ist der beabsichtigte nutzen des Polymorphismus, die Sie nicht erreichen können die Verwendung von statischen Methoden.
Es würde auch erfordern zu wissen, die spezifische Art der Klasse, die Sie wollten, rufen Sie die statische Methode, die brechen würde alle polymorphen verbergen der Unterschiede in Verhalten, dass das interface oder die abstrakte Klasse versucht zu erreichen.
Wenn das Verhalten, das repräsentiert wird durch den Konstruktor vorgesehen ist, das Bestandteil des Vertrages zwischen dem AUFTRAGGEBER diese Klassen dann würde ich hinzufügen, dass es explizit an der Schnittstelle.
Wird eine Hierarchie von Klassen haben ähnliche Initialisierung Anforderungen dann würde ich eine abstrakte Basis-Klasse, jedoch sollte es bis zu den Erben von Klassen, wie finden Sie die parameter für diesen Konstruktor, zu denen auch das aussetzen einer ähnlichen oder identischen Konstruktor.
Wenn dies bestimmt ist, um Ihnen zu erlauben, verschiedene Instanzen zur Laufzeit, dann würde ich empfehlen, eine statische Methode in eine abstrakte Basisklasse, die kennt die unterschiedlichen Bedürfnisse der alle konkreten Klassen (Sie verwenden könnte, dependency injection).
InformationsquelleAutor der Antwort marcj