必知的技术知识:DoubleDispatchAndVisitorPattern

简介: 必知的技术知识:DoubleDispatchAndVisitorPattern

1: Override VS. Overload


多态可以说是面向对象世界中一件锋利的武器, 封装变化是它的能力的体现。但是你听说过几种多态?


Simple Polymorphism :the object whose method is called is decided run-time.


multi- polymorphism :the object which method is called is decided upon the type of the argument


如果你对这两句描述不是很清楚, 那你知道override和overload吗?Simple Polymorphism 就意味使用了override, 而multi- polymorphism则意味着使用了overload


前者可能你比较熟悉,后者呢?两者又有什么不同?什么情况下我们会需要后者呢?你见过它们同时出现吗?


多态是用于封装变化的,比如常见的那个Shape Draw的例子。Client不用考虑具体是哪个Shape,通过多态自然能调用到相应的那个Shape的Draw方法(whose method)。但是这时我们只有一个变化的对象――Shape。 如果画的地方也变呢?比如我可以画在屏幕上, 也可以画到打印机上。现在我们有两个同时会变的因素, 那么Draw方法又通过什么来实现封装变化呢? Simple Polymorphism 显然是不够用了,multi- polymorphism 自然也该出场了。


就从一个游戏开始吧,在这个游戏中有一个怪物开门的场景。怪物有很多//代码效果参考:http://www.lyjsj.net.cn/wz/art_24191.html

种,本游戏的出场人物包括了矮人和泰坦,门也有两种 :一种普通的木头门, 还有就是很重的铁门。

现在怪物和门登场了…


interface Monster {}


class Drawf : Monster {}


class Giant : Monster {}


class Door


{


public virtual void OpenBy(Monster monster)


{


Console.WriteLine("Who are u?");


}


public virtual void OpenBy(Drawf dwarf)


{


Console.WriteLine("It's slowly opened");


}


public virtual void OpenBy(Giant giant)


{


Console.WriteLine("It's just easily broken...Crasp!");


}


}


class HeavyDoor : Door


{


//代码效果参考:http://www.lyjsj.net.cn/wx/art_24189.html

public override void OpenBy(Drawf dwarf)

{


Console.WriteLine("It won't open");


}


public override void OpenBy(Giant giant)


{


Console.WriteLine("It's slowly opened");


}


}


这里为了同时封装两种变化(怪物和门),我也同时使用了override 和 overload 。


接着怪物开始开门了…


class Game


{


static void Main()


{


Door ironDoor = new HeavyDoor();


ironDoor.OpenBy(new Drawf());


ironDoor.OpenBy(new Giant());


}


}


答案也很明显


这个例子同时应用了两种多态, 但是却只体现了第一种多态封装变化的效果!如何将两者都体现出来?看下面的测试


class Game


{


static void Main()


{


Door ironDoor = new HeavyDoor();


List[span style="color: rgba(0, 128, 128, 1)">MonsterMonster

monsters.Add(new Drawf());


monsters.Add(new Giant());


foreach (Monster m in monsters)


ironDoor.OpenBy(m);


}


}


现在你能猜到结果吗?仔细想想别急着看答案。


很正常?Ok. 你可以直接去看下一节的内容了,如果猜错了请先复习一下下面的基础知识吧.


你肯定听说过所谓的”动态绑定”,通常意义上的多态也就是通过它实现的,简而言之――the object whose method is called is decided run-time . 重点就在于这个run-time . <span style="font-family: 宋体; mso-hansi-font-family:

相关文章
|
存储 JavaScript 安全
JS正则表达式:常用正则手册/RegExp/正则积累(二)
JS正则表达式:常用正则手册/RegExp/正则积累
116 0
|
9月前
|
Python
正则表达式高级用法
正则表达式是强大的文本匹配工具,常用于搜索、匹配和验证字符串。高级用法包括:捕获组(区分需要提取的内容)、非捕获组(减少开销)、零宽断言(定位匹配位置)、反向引用(匹配相同内容)、嵌入代码(实现复杂逻辑)、贪婪与非贪婪匹配(控制匹配范围)和递归匹配(处理嵌套结构)。了解这些高级技巧能提升字符串操作效率。示例展示了验证Email、电话号码、提取URL和清理多余空格的正则表达式应用。
学习正则表达式
学习正则表达式
54 0
|
9月前
|
数据采集 监控 Go
掌握Go语言正则表达式:regexp包全面解析
掌握Go语言正则表达式:regexp包全面解析
266 0
|
9月前
|
JavaScript 前端开发 数据库
正则表达式[进阶]
正则表达式[进阶]
68 0
|
9月前
|
C++
正则表达式基础
正则表达式基础
|
C++ Windows Perl
[笔记]c++基础实践《二》regex正则表达式
[笔记]c++基础实践《二》regex正则表达式
|
数据采集 搜索推荐 算法
十一、正则表达式详解:掌握强大的文本处理工具(三)
十一、正则表达式详解:掌握强大的文本处理工具(三)
|
SQL Linux Shell
正则表达式实战
本文都是基于Linux 支持的正则来实战。关于正则的流派见这里。
153 1
常用的正则表达式(方便自己看)
常用的正则表达式(方便自己看)
41 0