最近C#的泛型使用频次略多,特在此记下一个印象深刻的。
情景如下,
基类BaseClass 有一系列的子类 SubClass1, SubClass2, SubClass3... 且其构造函数的参数较多。使用工厂模式实例化子类的代码大致如下:
1 BaseClass CreateInstance(TYPE type, object param1, object param2, object param3, object param4) 2 { 3 BaseClass instance = null; 4 switch(type) 5 { 6 case type1: instance = new SubClass1(param1, param2, param3, param4);break; 7 case type2: instance = new SubClass2(param1, param2, param3, param4);break; 8 case type3: instance = new SubClass3(param1, param2, param3, param4);break; 9 ... 10 } 11 return instance; 12 }
上面代码,个人觉得不够简洁,特别是每拷贝粘贴一行都有种被恶心到的感觉...
所以使泛型重写上面的实现:
在BaseClass中加入虚函数Init(object param1, object param2, object param3, object param4); 并将其构造函数改为无参,其各子类都如此改造。这样上面的实例化子类的代码则变为
1 BaseClass CreateInstance(TYPE type, object param1, object param2, object param3, object param4) 2 { 3 BaseClass instance = null; 4 switch(type) 5 { 6 case type1: instance = CreateInstance<SubClass1>();break; 7 case type2: instance = CreateInstance<SubClass2>();break; 8 case type3: instance = CreateInstance<SubClass3>();break; 9 ... 10 } 11 instance.Init(param1, param2, param3, param4); 12 return instance; 13 } 14 15 T CreateInstance<T>() where T : BaseClass, new() 16 { 17 T t = new T(); 18 return t; 19 }
这样总算让我舒服了些... 以后即使要改变初始化时的参数个数改动也相对少了很多...