我可以限制哪些类可以实例化另一个类?
可能重复:
Factory pattern in C#: How to ensure an object instance can only be created by a factory class?我可以限制哪些类可以实例化另一个类?
假设我有一个知道如何使广场的工厂类。如果我觉得只有Factory类知道如何制作一个正方形,并且我想阻止其他人(即使在同一个装配中)创建一个Square,那么正确的方式(如果有这样的事情的话)可以去解决吗?
你可以在工厂和类移动到组装和纪念类的构造函数内部,使其只能从组件内调用。
请注意,这将允许其他组件成员虽然访问的构造,不仅工厂。
这是怎么Lookup<TKey, TElement>
作品实例。我看到(与工厂,并在同一组件上的Square
)
也许我会解决最终使用。我想在某些时候,如果我真的想要如果有人滥用它,我可以使用一些反射来在运行时抛出异常。 – 2012-02-03 11:25:25
一种方式是将你的工厂方法为Square
类的静态方法,并添加只有私有构造您Square
类。
您也可以将您的Factory
类作为一个内部类的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();
}
}
}
然后:
Square.Factory factory = new Square.Factory();
Square square = factory.CreateSquare();
如果我要做到这一点,岂不更有意义有广场是内部类,这样我可以为圆形或三角形一样吗?这显然向后似乎我,但我看到别人发布了同样的答案,因此让我好奇,如果我在这里失去了一些东西... – 2012-02-03 10:38:46
@BrandonMoore:它不会在这种情况下工作,作为含类不有权访问嵌套类的私有成员。我们需要知道一个更现实的场景,基本上 - 这种模式非常有用(特别是对于实现Builder模式),但它不是*通用*适用的。 – 2012-02-03 10:56:20
哦,对,我知道。奇怪的是,我认为我听说根据规范,内部类不应该访问外部类的私有成员......但是由于C#和其他编译器有用,所以它仍然允许它。 – 2012-02-03 11:01:42
使构造函数为私有,工厂类为Square的嵌套类型:http://*.com/a/515288/ 284240 – 2012-02-03 10:27:45
感谢蒂姆,但不工作这么好,当我要添加三角形和菱形...... – 2012-02-03 11:23:04