怎么禁止对象直接实例化
如何禁止对象直接实例化
比如有两个类:
class A{
...
}
class B{
public static A createA();
}
类A不能直接实例化,如 A a = new A();
禁止象上面直接实例化,
而必须通过B的方法来创建A,
如:
A a = B.createA();
就是说:
A a = new A(); //不允许这样直接实例化
A a = B.createA(); //只能通过B来创建A
------解决方案--------------------
使用嵌套类
class B{
public static A createA();
class A{
...
}
}
------解决方案--------------------
------解决方案--------------------
比如有两个类:
class A{
...
}
class B{
public static A createA();
}
类A不能直接实例化,如 A a = new A();
禁止象上面直接实例化,
而必须通过B的方法来创建A,
如:
A a = B.createA();
就是说:
A a = new A(); //不允许这样直接实例化
A a = B.createA(); //只能通过B来创建A
------解决方案--------------------
使用嵌套类
class B{
public static A createA();
class A{
...
}
}
------解决方案--------------------
------解决方案--------------------
- C# code
class Program { static void Main(string[] args) { A a=B.CreateA(); Console.WriteLine(a.aa); Console.Read(); } } class A { private A()//禁止直接实例化 { } public int aa = 2; } class B { public static A CreateA() { //通过反射实例化 Type t = typeof(A); A a = t.Assembly.CreateInstance(t.FullName, false, BindingFlags.CreateInstance | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.ExactBinding, null, null, null, null) as A; return a; } }
------解决方案--------------------
分在不同的 dll 里面,不能用嵌套
那就没法实现了,你的设计存在问题,是错误的
------解决方案--------------------
分在不同工程!呵呵。
不要管它了。不用禁止。
这就好比如说你找了个一开始就被定义为相当自由的女朋友,你想给她戴上贞洁带,那是纠结的。还不如不用管了,看看能测试出什么bug来?!
------解决方案--------------------
------解决方案--------------------
------解决方案--------------------
编程以系统集成测试为原则,而不是以所谓的“封闭概念、个人洁癖”为原则。很多时候为了让程序可测,我们需要把private的方法定义修改为public的,仅仅是为了迎合自动化测试系统的需要。此时不用过度纠结于作用域定义,让我们看看测试工程能测试什么bug来?!
------解决方案--------------------
其实反射也是实例化的一种方法,你如果真的禁止实例化,反射也应该禁止才行,实际上你禁止不了。
定义为abstract类型后,反射不了了,你也实例化不了了
------解决方案--------------------