c#限制在命名空间内创建类实例

本文关键字:创建 实例 命名空间 | 更新日期: 2023-09-27 17:49:49

我有两个对象,RoomManagerRoom,将有几个Room和一个RoomManager。我希望RoomManager是唯一允许创建Room对象的。所以我想知道是否有一种方法可以使Room构造函数(以及Room方法/属性的其余部分)只能访问RoomManager。我在想也许把它们移到自己的命名空间,让Room私有或内部或其他东西。从可访问性级别(c#参考)中,我看到内部是针对整个程序集的,而不仅仅是名称空间。

c#限制在命名空间内创建类实例

不,c#(和一般。net)没有特定于命名空间的访问修饰符。

一个相当hack的解决方案是使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访问。

在RoomManager内部定义Room并使其构造函数为private可能会有帮助。

编辑:

但是我认为最好的解决方案是提取一个Room的抽象类,并将这个类公开给客户端。

不能创建抽象类的实例

你应该实现'单例模式'。它只创建一次对象,任何后续尝试创建该类型的对象实际上都会返回已经创建的对象。
您应该创建类工厂来实现RoomManager的单例。反过来,Room应该是RoomNamager的私有类型。RoomNamager管理器应该有创建Room的方法。但是在这种情况下,您不能在RoomManager类之外访问Room属性。为了解决这个问题,我建议您创建IRoom公共接口,它将授予对房间功能的访问权限。所以你的create room方法将返回IRoom接口。