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.
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.
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.
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.
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.
Tags und Links c# class-design access-modifiers