发文章
发文工具
撰写
网文摘手
文档
视频
思维导图
随笔
相册
原创同步助手
其他工具
图片转文字
文件清理
AI助手
留言交流
情景如下,
基类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 }
这样总算让我舒服了些... 以后即使要改变初始化时的参数个数改动也相对少了很多...
来自: 昵称10504424 > 《工作》
0条评论
发表
请遵守用户 评论公约
C#综合揭秘——反射的奥妙
利用Assembly的object CreateInstance(string) 方法可以反射创建一个对象,参数0为类名。常用的方法有GetValue(object,object[]) 获取属性值和 SetValue(object,object,object[]) 设置属性值。///<...
C#反射
WriteLine("This''''''''s t.type={0},w.type={1}, x.type={2},t:{3},w:{4},x:{5}", t...
DrawingManager.js
169 * @grammar obj.addEventListener(type, handler[, key])170 * @param {string} type 自定义事件的名称171 * @param {Function} handler 自定义事...
hibernate的继承类的映射
简单网页版JS播放器自己动手DIY音乐播放器
playerinfo.innerHTML = player.settings.volume;playerinfo.innerHTML = ''左声道''; break; case 100: player.settings.balance = -100; playerinfo.innerHTML = ''...
Java中二进制、十进制、十六进制及ASCII码与String及字节数组与十六进制之间的转换
C#实现将浮点数表示的货币数量以汉字大写形式输出的方法
java 组合键 钩子 键盘
public class KeyLLHook {public static void main(String[] args) {KeyLLHook key = new KeyLLHook();INSTANCE.PeekMessage(msg, null, 0, 0, 1)) {if (msg.message == User32.INSTANCE.WM_HOTKEY) {S...
Python中switch-case实现
Python中switch-case实现。Python不像C/C++,Java等有switch-case的语法。def calc(type,x,y): calculation = {''+'':lambda:add(x,y), ''*''...
微信扫码,在手机上查看选中内容