C#将类实例的创建限制在名称空间

问题描述

我有两个对象,分别是
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
接口。     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...