日期:2014-05-17  浏览次数:21178 次

如何禁止对象直接实例化
比如有两个类:
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{
...
}

}
------解决方案--------------------
探讨

引用:
private A(){}


楼上不行啊,
如果这样,
那 类 B 里也没办法创建 A 对象了。

就是说只允许 B 能创建 A 对象,不允许其它任何地方能创建 A 对象。
因为 B 会初始化一些 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来?!
------解决方案--------------------
探讨
因为 A 和 B 是不同层的,分在不同的 dll 里面,不能用嵌套

------解决方案--------------------
探讨

你的设计存在问题,是错误的


------解决方案--------------------
编程以系统集成测试为原则,而不是以所谓的“封闭概念、个人洁癖”为原则。很多时候为了让程序可测,我们需要把private的方法定义修改为public的,仅仅是为了迎合自动化测试系统的需要。此时不用过度纠结于作用域定义,让我们看看测试工程能测试什么bug来?!
------解决方案--------------------
其实反射也是实例化的一种方法,你如果真的禁止实例化,反射也应该禁止才行,实际上你禁止不了。
定义为abstract类型后,反射不了了,你也实例化不了了
------解决方案--------------------
探讨
在不同的dll中,只能通过反射实例化,可以参考7楼的代码,也可以用下面的代码:

C# code
A a=Assembly.LoadFile("XXXx.dll").CreateInstance(XXXXXXXXXXXX) as A;