C# 我可以限制哪些类可以实例化另一个类吗?

C# 我可以限制哪些类可以实例化另一个类吗?,c#,oop,C#,Oop,可能重复: 假设我有一个工厂类,它知道如何制作正方形。如果我觉得只有Factory类知道如何创建正方形,并且我想阻止其他人(即使在同一个部件中)创建正方形,那么正确的做法是什么(如果有这样的事情)方法?您可以将工厂和类移动到程序集,并将类的构造函数标记为内部,以便只能从程序集中调用它 请注意,这将允许其他程序集成员访问构造函数,而不仅仅是工厂 例如,这就是查找的工作方式。我看到的一种方法(工厂和Square在同一个程序集中)是将工厂方法作为Square类的静态方法移动,并且只向Square类添

可能重复:


假设我有一个工厂类,它知道如何制作正方形。如果我觉得只有Factory类知道如何创建正方形,并且我想阻止其他人(即使在同一个部件中)创建正方形,那么正确的做法是什么(如果有这样的事情)方法?

您可以将工厂和类移动到程序集,并将类的构造函数标记为内部,以便只能从程序集中调用它

请注意,这将允许其他程序集成员访问构造函数,而不仅仅是工厂

例如,这就是
查找
的工作方式。

我看到的一种方法(工厂和
Square
在同一个程序集中)是将工厂方法作为
Square
类的静态方法移动,并且只向
Square
类添加私有构造函数

您还可以将
工厂
类作为
正方形
的内部类移动:

public class Square
{
    private Square()
    {
    }

    public int Size { get; set; }

    public static class Factory
    {
        public static Square CreateClass()
        {
            return new Square { Size = 10 };
        }
    }
}

根据您的情况,您可以这样做:

public class Square
{
    // Only Square and classes nested within it can call this
    private Square()
    {
    }

    public class Factory
    {
        public Square CreateSquare()
        {
            return new Square();
        }
    }
}
然后:


让构造函数私有化,让工厂类成为嵌套类型的正方形:谢谢Tim,尽管当我想添加三角形和菱形时,这样做效果不太好……如果我要这样做的话,让正方形成为内部类,这样我就可以对圆和三角形做同样的事情,这不是更有意义吗?这在我看来显然是倒退了,但我看到其他人发布了相同的答案,所以我很好奇我是否遗漏了什么…@BrandonMoore:在这种情况下,它不起作用,因为包含类无法访问嵌套类的私有成员。我们需要知道一个更现实的场景,基本上-这个模式是一个有用的模式(特别是对于实现构建器模式),但它不是普遍适用的。哦,对了,我知道。奇怪的是,我想我听说根据规范,内部类也不能访问外部类的私有成员。。。但是c#和其他编译器无论如何都允许它,因为它很有用。@BrandonMoore:不,根据规范,它很好,尽管有一点不太清楚。但是从第3.5.2节开始,对于在类型T中声明的嵌套成员M的可访问性域:“如果声明的M的可访问性是私有的,则M的可访问性域是T的程序文本。”嵌套类型仍然在包含类型的程序文本中,所以没关系。你确定不应该是律师Jon吗?:)可能是我最终使用的解决方案。我想在某个时候,如果我真的想,我可以使用一些反射在运行时抛出一个异常,如果有人误用它。
Square.Factory factory = new Square.Factory();
Square square = factory.CreateSquare();