Verschachtelte Klasse mit verstecktem Konstruktor in c # nicht möglich?

8

Ich habe in letzter Zeit etwas programmiert und bin auf ein Problem gestoßen, das ich in c # seltsam fand. (zumindest für mich)

%Vor%

Ich möchte, dass der Benutzer von Foo in der Lage ist, einen Verweis auf FooSpecificCollection zu erhalten, sogar einige Operationen darauf auszuführen. Vielleicht legen Sie es sogar auf eine andere Eigenschaft von Foo oder smth, aber nicht in der Lage, eine Instanz dieser Klasse zu erstellen. (Die einzige Klasse, die in der Lage sein sollte, diese Sammlung zu installieren, sollte Foo sein.

Ist meine Anfrage wirklich so weit hergeholt? Ich weiß, dass die Leute viel schlauer c # definiert haben, aber sollte es nicht eine solche Option geben, dass eine Elternklasse eine verschachtelte Klasseninstanz erstellen kann, die niemand anders kann.

Bisher habe ich eine Lösung erstellt, um eine abstrakte Klasse oder Schnittstelle über die Eigenschaft verfügbar zu machen und eine konkrete private Klasse zu implementieren, die nirgendwo anders verfügbar ist.

Ist das ein richtiger Umgang mit einer solchen Situation?

    
luckyluke 13.03.2010, 21:56
quelle

5 Antworten

4

Embedded-Klassen funktionieren so, dass sie als Mitglieder der äußeren Klasse Zugriff auf private Mitglieder dieser äußeren Klasse erhalten. Aber nicht umgekehrt (was du willst).

Sie können den Konstruktor von FooSpecificCollection schützen, aber dann muss die Factory selbst Teil von FooSpecificCollection sein. Es könnte die äußere Klasse einbeziehen:

%Vor%     
Henk Holterman 13.03.2010, 22:25
quelle
4

Machen Sie Ihre verschachtelte Klasse private und geben Sie den Rückgabewert von GetFoosStuff IList<Bar> anstelle von FooSpecificCollection ein.

Auch besteht eine gute Chance, dass ab List<Bar> ist ein Fehler .

    
Sam Harwell 13.03.2010 22:08
quelle
3

Wenn Sie eine Bibliothek erstellen, die andere verwenden können, können Sie den Konstruktor internal erstellen. Jeder außerhalb der Bibliothek kann nicht darauf zugreifen. Wenn Sie Bedenken haben, den Konstruktor in Ihrem eigenen Projekt aufzurufen, nennen Sie ihn nicht außerhalb der Elternklasse.

Wir erstellen ständig Klassen, die nicht direkt mit anderen Klassen zusammenhängen, aber die Konstruktoren müssen nicht vor nicht verwandten Klassen verborgen sein. Wir (die Programmierer) wissen, dass die Objekte nicht miteinander verwandt sind, so dass wir niemals eine Instanz der einen in der anderen erstellen.

    
Zach Johnson 13.03.2010 21:59
quelle
1

Es gibt eine Lösung, aber ich glaube nicht, dass ich sie in meiner App verwenden würde :) Die Idee ist, eine Klasse von FooSpecific abzuleiten, die privat ist und nur innerhalb von Foo verwendet werden kann, aber einen öffentlichen Konstruktor hat, so dass Foo ihre Instanzen erstellen kann.

%Vor%     
Andrew Bezzub 13.03.2010 22:09
quelle
0

Nein, und es ergibt keinen Sinn.

Ich meine, der ganze Punkt ist so, dass Sie möglicherweise andere Instanzen zurückgeben können; aber wer wird von dieser Klasse sowieso abgeleitet werden? Sicherlich keine anderen Klassen (Weil das falsch wäre und nicht in der Hauptklasse versteckt sein sollte), also ...

    
Noon Silk 13.03.2010 22:02
quelle