Ist es eine gute Idee (Konstruktor-Aufrufe zu verschachteln), um überladene New- oder Factory-Style-Methoden zu verschachteln? Dies ist hauptsächlich für einfache Konstruktoren, wo jede Überladung auf der vorherigen aufbaut.Ist die Verschachtelung von Konstruktoren (oder Factory-Methoden) gut, oder sollten alle alle Init-Arbeiten ausführen?
MyClass(arg1) {
_arg1 = arg1;
_otherField = true;
_color="Blue"
}
MyClass(arg1, arg2) : this(arg1) {
_arg2 = arg2
}
MyClass(arg1, arg2, arg3) : this(arg1, ar2) {
_arg3 = arg3;
}
Oder mit Fabrikmethoden:
static NewInstance(arg1) {
_arg1 = arg1;
}
static NewInstance(arg1, arg2) {
f = NewInstance(arg1);
f._arg2 = arg2;
}
//... and so on
ich einige Nachteile auf beiden Seiten sehen kann
- Nesting versteckt, was der Konstruktor die Funktionalität
- Nicht Verschachtelung Duplikaten alle tut
Macht das also eine gute Idee, oder richtet es mich auf etwas aus, das ich gerade nicht als Problem sehe? Aus irgendeinem Grund fühle ich mich unbehaglich, weil es die Verantwortung für die Initialisierung teilt.
Bearbeiten: @ Jon Skeet: Ich sehe jetzt, warum dies mich so sehr belastete. Ich habe es rückwärts gemacht! Ich schrieb die ganze Sache und bemerkte es nicht einmal, es roch einfach. Die meisten anderen Fälle, die ich habe (die ich geschrieben habe), tun es so, wie Sie es empfehlen, aber das ist sicherlich nicht die einzige, die ich so gemacht habe. Ich bemerke, dass die komplizierteren, die ich richtig gemacht habe, aber die einfachen, die ich scheinbar schlampig geworden bin. Ich liebe Mikrobearbeitungen. Ich mag auch Akronyme!
Einen weiteren Satz von klugen Worten initialisieren! –
Leider funktioniert diese Technik nicht für Standardwerte der Laufzeit.In diesem Beispiel zeigen Sie Konstanten für die optionalen Parameter an. Wenn diese Werte keine Konstanten wären, könnten Sie den Code nicht kompilieren, sondern müssten zu den Werten in den Konstruktorkörpern wechseln. – JeremyDWill
Nein, sie können Laufzeitwerte sein, die durch Ausführen von statischen Methoden/Eigenschaften abgerufen werden. Bearbeitete Antwort, um ein Beispiel zu geben. –