c#限制在命名空间内创建类实例
本文关键字:创建 实例 命名空间 | 更新日期: 2023-09-27 17:49:49
我有两个对象,RoomManager
和Room
,将有几个Room
和一个RoomManager
。我希望RoomManager
是唯一允许创建Room
对象的。所以我想知道是否有一种方法可以使Room
构造函数(以及Room
方法/属性的其余部分)只能访问RoomManager
。我在想也许把它们移到自己的命名空间,让Room
私有或内部或其他东西。从可访问性级别(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
接口。