不是嵌入式开发!也不是依赖注入!这个词是我杜撰的,如有雷同,纯属扯蛋。
什么是 ”注入式开发“?
就是我们要调用一个类的现成方法的时候,在这个方法中写入一些自己的代码,寄生在这个方法里面,随同这个方法一起运行。甚至乎,我们写的代码喧宾夺主,完全取代了原有的代码。此谓注入。就好像《黑客帝国》里的机器人,用一只手指点在人类身上,说:咪咪咪(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 = "前天在高速上。。。。"我这段牢骚话,而不是返回默认设定的话;
总结:这种类内声明、调用委托,类外实现委托的方式,调用方可以对类方法的运行施加影响,从而实现调用方个性化的效果,或者说,实现了多态。这种多态,不是通过重写虚函数的方式,而是通过实现类的委托。委托就好像尖刀一样插入了类的胸膛,又好像卧底一样潜藏在类的深处。通过委托,我们可以像黑客帝国的机器人,手指点在那个类上,说:咪咪咪。。。
版权声明:本文为博主原屙文章,喜欢你就担走。