问题描述
我有两个对象,分别是
RoomManager
和Room
,会有多个Room
和一个RoomManager
。我希望“ 0”成为允许创建“ 1”对象的唯一对象。所以我想知道是否有一种方法可以使RoomManager
只能访问Room
构造函数(以及其余Room
方法/属性)。我在想也许将它们移到自己的名称空间,然后将“ 1”私有或内部化。从可访问性级别(C#参考)中,我看到内部组件适用于整个程序集,而不仅仅是命名空间。
解决方法
不,C#(通常是.NET)没有特定于名称空间的访问修饰符。
一个相当不错的解决方案是使Room仅具有一个私有构造函数,并使RoomManager成为嵌套类(可能称为Manager):
public class Room
{
private Room() {}
public class Manager
{
public Room CreateRoom()
{
return new Room(); // And do other stuff,presumably
}
}
}
像这样使用它:
Room.Manager manager = new Room.Manager();
Room room = manager.CreateRoom();
正如我说的那样,这有点。当然,您可以将Room和RoomManager放在自己的程序集中。
,您可以执行以下操作:
var room = Room.Factory.Create();
如果Room的构造函数是私有的,则在Room类中声明工厂类后,仍可以从Room.Factory访问它。
,在RoomManager本身内部定义Room并将其构造函数设为私有可能会有所帮助。
编辑:
但是我认为最好的解决方案是提取Room的抽象类,并将该类公开给客户。
没有人可以创建抽象类的实例。
,您应该实现\'Singleton模式\'。它仅创建对象一次,并且随后创建该类型对象的任何尝试实际上都会返回已创建的对象。
您应该创建类工厂,该工厂将为RoomManager
实现单例。反之,Room
应该是private15ѭ的私有类型。 RoomNamager
经理应具有创建Room
的方法。但是在这种情况下,您将无法访问RoomManager
类之外的Room
属性。为解决此问题,我建议您创建IRoom
公共接口,该接口将授予对房间功能的访问权限。因此,您的create room
方法将返回IRoom
接口。