首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

怎么禁止对象直接实例化

2012-10-11 
如何禁止对象直接实例化比如有两个类:class A{...}class B{public static A createA()}类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{
...
}

}
[解决办法]

探讨

引用:
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;

热点排行