必知的技术知识: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:

相关文章
|
8月前
|
程序员 Python
在Python编程语言中,`pass`语句
在Python编程语言中,`pass`语句
83 2
|
监控 负载均衡 应用服务中间件
Passenger作用及原理梳理
我们在部署rails应用时,大多时候都使用Nginx+Passenger的方式部署,本文主要对此架构下 Passenger的作用及其工作原理进行梳理。 一、什么是Passenger? Phusion Passenger是一个开源的Web应用服务器,它能够处理HTTP请求,管理进程和资源、 系统监控以
706 0
|
6月前
|
人工智能 自然语言处理 监控
RPA学习第一课 --初识RPA
RPA学习第一课 --初识RPA
870 1
|
Arthas Java 程序员
面试官: 这些都不清楚,如何pass?
面试官: 这些都不清楚,如何pass?
55 0
|
C++ Windows Perl
[笔记]c++基础实践《二》regex正则表达式
[笔记]c++基础实践《二》regex正则表达式
|
缓存 Linux Windows
certutil工具使用和bypass学习
certutil工具使用和bypass学习
775 0
|
Java
【BUG日记】【JAVA】replaceFirst、substring、Pattern和Matcher的联合使用,出现中断问题。
【BUG日记】【JAVA】replaceFirst、substring、Pattern和Matcher的联合使用,出现中断问题。
153 0
【BUG日记】【JAVA】replaceFirst、substring、Pattern和Matcher的联合使用,出现中断问题。
|
JavaScript 测试技术
【类型挑战】Parameters,难度⭐️
【类型挑战】Parameters,难度⭐️
135 0
【类型挑战】Parameters,难度⭐️
|
设计模式 安全 Java
设计模式|从Visitor Pattern说到Pattern Matching
在软件开发领域,我们每次遇到的问题可能都各不相同,有些是跟电商业务相关的,有些是跟底层数据结构相关的,而有些则可能重点在性能优化上。然而不管怎么样,我们在代码层面上解决问题的方法都有一定的共性。有没有人总结过这些共性呢?
设计模式|从Visitor Pattern说到Pattern Matching
|
测试技术 Python
为什么“except:pass”是一个不好的Python编程习惯?
我时常在StackOverflow上看到有人评论关于 except: pass 的使用,他们都提到这是一个不好的Python编程习惯,应该避免。可我想知道为什么?有时候我并不在意出现的错误,而是只想让我的程序继续进行下去。就像这样:
183 0