C # Begrenzen Sie die Erstellung der Klasseninstanz auf den Namespace

8

Ich habe zwei Objekte, RoomManager und Room , es wird mehrere Room s und ein RoomManager geben. Ich möchte, dass RoomManager die einzige Person ist, die ein Objekt Room erstellen darf. Ich frage mich, ob es eine Möglichkeit gibt, den Room -Konstruktor (und den Rest der Room Methoden / Eigenschaften) nur für RoomManager zugänglich zu machen. Ich dachte daran, sie vielleicht in ihren eigenen Namespace zu verschieben und Room privat oder intern oder so zu machen. Von Zugriffsstufen (C # -Referenz) sehe ich, dass intern ist für die gesamte Assembly, nicht nur für den Namespace.

    
jb. 13.04.2011, 07:06
quelle

4 Antworten

9

Nein, C # (und .NET im Allgemeinen) hat keine Zugriffsmodifikatoren, die für Namespaces spezifisch sind.

Eine ziemlich hackige Lösung wäre es, Room einen privaten Konstruktor zu geben und RoomManager zu einer verschachtelten Klasse zu machen (möglicherweise nur Manager genannt):

%Vor%

Benutze es so:

%Vor%

Wie ich schon sagte, das ist ein bisschen hacky obwohl. Sie könnten natürlich Room und RoomManager in ihre eigene Assembly einfügen.

    
Jon Skeet 13.04.2011, 07:09
quelle
3

Sie können so etwas tun:

%Vor%

Wenn der Konstruktor von Room privat ist, ist er weiterhin von Room.Factory aus zugänglich, wenn Sie die Factory-Klasse in der Room-Klasse deklarieren.

    
Ilya Kogan 13.04.2011 07:11
quelle
1

Es kann hilfreich sein, den Raum innerhalb von RoomManager selbst zu definieren und seinen Konstruktor privat zu machen.

BEARBEITEN:   Aber die beste Lösung, denke ich, ist, eine abstrakte Klasse des Raumes zu extrahieren und diese Klasse den Kunden zugänglich zu machen.

Niemand kann eine Instanz der abstrakten Klasse erstellen.

    
Jahan Zinedine 13.04.2011 07:10
quelle
0

Sie sollten ein Singleton-Muster implementieren. Es erstellt Objekt nur einmal und alle nachfolgenden Versuche, ein Objekt dieses Typs zu erstellen, werden tatsächlich bereits erstellte Objekte zurückgeben.
Sie sollten eine Klassenfactory erstellen, die Singleton für RoomManager implementiert. Room wiederum sollte ein privater Typ von RoomNamager sein. RoomNamager manager sollte eine Methode für Room creation haben. In diesem Fall können Sie jedoch nicht auf die Eigenschaften Room außerhalb der Klasse RoomManager zugreifen. Um dieses Problem zu lösen, empfehle ich Ihnen, IRoom public interface zu erstellen, das den Zugriff auf die Raumfunktionalität gewährt. Ihre create room Methode würde also IRoom interface zurückgeben.

    
Anton Semenov 13.04.2011 08:40
quelle