注入式开发
2015-07-27 18:07
197 查看
不是嵌入式开发!也不是依赖注入!这个词是我杜撰的,如有雷同,纯属扯蛋。
什么是 ”注入式开发“?
就是我们要调用一个类的现成方法的时候,在这个方法中写入一些自己的代码,寄生在这个方法里面,随同这个方法一起运行。甚至乎,我们写的代码喧宾夺主,完全取代了原有的代码。此谓注入。就好像《黑客帝国》里的机器人,用一只手指点在人类身上,说:咪咪咪(me、me、me),结果那个人就变成了他。传说,螟蛉这种虫没有生育能力,只好偷其他昆虫的蛋,放到自己窝里,然后整天对着蛋祷告:似我、似我,结果蛋孵化出来,真的就变成了螟蛉。我每次在进行注入式开发的时候,就想到这些故事。
那么怎么注入呢?
多态是面向对象的三大特性之一,实现方式就是虚函数。父类定义虚函数,然后子类各自实现之。运行的时候,不同的子类,虽然应用了同一个虚函数,但运行结果迥异,这就是多态。
但是,我们在调用方法的时候,难道下下都要继承一个类,然后重写其虚函数吗?未免太繁琐。
这时可以用委托。
就是在类里面定义、声明一个委托,在类的方法里面检查、运行这个委托,在调用代码里实现这个委托。
有代码有j8:
类代码:
调用代码
总结:这种类内声明、调用委托,类外实现委托的方式,调用方可以对类方法的运行施加影响,从而实现调用方个性化的效果,或者说,实现了多态。这种多态,不是通过重写虚函数的方式,而是通过实现类的委托。委托就好像尖刀一样插入了类的胸膛,又好像卧底一样潜藏在类的深处。通过委托,我们可以像黑客帝国的机器人,手指点在那个类上,说:咪咪咪。。。
什么是 ”注入式开发“?
就是我们要调用一个类的现成方法的时候,在这个方法中写入一些自己的代码,寄生在这个方法里面,随同这个方法一起运行。甚至乎,我们写的代码喧宾夺主,完全取代了原有的代码。此谓注入。就好像《黑客帝国》里的机器人,用一只手指点在人类身上,说:咪咪咪(me、me、me),结果那个人就变成了他。传说,螟蛉这种虫没有生育能力,只好偷其他昆虫的蛋,放到自己窝里,然后整天对着蛋祷告:似我、似我,结果蛋孵化出来,真的就变成了螟蛉。我每次在进行注入式开发的时候,就想到这些故事。
那么怎么注入呢?
多态是面向对象的三大特性之一,实现方式就是虚函数。父类定义虚函数,然后子类各自实现之。运行的时候,不同的子类,虽然应用了同一个虚函数,但运行结果迥异,这就是多态。
但是,我们在调用方法的时候,难道下下都要继承一个类,然后重写其虚函数吗?未免太繁琐。
这时可以用委托。
就是在类里面定义、声明一个委托,在类的方法里面检查、运行这个委托,在调用代码里实现这个委托。
有代码有j8:
类代码:
public class StaticChart { //定义、声明委托 public delegate string DlgSetHtml(Dictionary<string, string> dict, string title, string summary); public DlgSetHtml dlgSetHtml { get; set; } public virtual string GetChartHtml(Dictionary<string, string> dict , string title , string summary) { //如果委托存在,则执行委托,并且返回。下面那些一大坨的代码就被架空了。该方法已被注入,附体 if (dlgSetHtml != null) return dlgSetHtml(dict, title, summary); //这里是一大坨默认代码 return "这是一段默认话"; }
调用代码
StaticChart chart = new StaticChart(); //实现委托 chart.dlgSetHtml = (dictT, title, summary) => { StringBuilder sb = new StringBuilder(""); sb.Append("前天在高速上,临近某个出口,有个混蛋在我这条车道上停!住!了!老子时速80公里冲过去,赶紧踩刹车减速,瞄了一下右边的车道,后面有辆车,好像还比较紧,顾不上了,稍稍变了一下道,与那鸟人擦身而过!我*你M的,世上还真有这种害人害己的傻逼!"); return sb.ToString(); }; string re = chart.GetChartHtml(dict,"标题","小结"); //执行之后,re = "前天在高速上。。。。"我这段牢骚话,而不是返回默认设定的话;
总结:这种类内声明、调用委托,类外实现委托的方式,调用方可以对类方法的运行施加影响,从而实现调用方个性化的效果,或者说,实现了多态。这种多态,不是通过重写虚函数的方式,而是通过实现类的委托。委托就好像尖刀一样插入了类的胸膛,又好像卧底一样潜藏在类的深处。通过委托,我们可以像黑客帝国的机器人,手指点在那个类上,说:咪咪咪。。。
相关文章推荐
- oracle 任务使用
- JavaScript中的Repaint和Reflow用法详解
- breeze densematrix 基本操作
- apache worker性能调优
- Codeforces 557E - Ann and Half-Palindrome (字典树+DP)
- 短信拦截再总结
- 使用Spring Boot和Gradle创建AngularJS项目
- HDU 3271-SNIBB(数位dp)
- HDU1052——田忌赛马(贪心)
- 欢迎使用CSDN-markdown编辑器
- 【C语言】3子棋游戏,
- NYOJ 找数达人 (找n个数构成m是否存在)
- 怎样将整型变量转换为字符变量 然后串口 或者LCD发送出来(STM32) 以及sprintf的用法
- Android视频播放开源库vitamio
- Xcode 快捷键
- Spark1.4.1 编译与安装
- 如何成功实施SDL提供的官方Android平台Demo
- 通知
- 面向对象
- 点击手机物理键返回