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

相关文章
|
4月前
|
机器学习/深度学习 C语言
经验大分享:pascal基础
经验大分享:pascal基础
24 0
|
3月前
|
SQL Java
JPA 学习
JPA 学习
|
12月前
|
设计模式 JavaScript
什么是程序设计里的 backoff pattern
什么是程序设计里的 backoff pattern
|
JavaScript 测试技术
【类型挑战】Parameters,难度⭐️
【类型挑战】Parameters,难度⭐️
124 0
【类型挑战】Parameters,难度⭐️
|
Java Spring
Spring注解原理学习之@Size and @Pattern
Spring注解原理学习之@Size and @Pattern
491 0
Spring注解原理学习之@Size and @Pattern
|
设计模式 安全 Java
设计模式|从Visitor Pattern说到Pattern Matching
在软件开发领域,我们每次遇到的问题可能都各不相同,有些是跟电商业务相关的,有些是跟底层数据结构相关的,而有些则可能重点在性能优化上。然而不管怎么样,我们在代码层面上解决问题的方法都有一定的共性。有没有人总结过这些共性呢?
设计模式|从Visitor Pattern说到Pattern Matching
|
.NET C#
[.NET领域驱动设计实战系列]专题三:前期准备之规约模式(Specification Pattern)
原文:[.NET领域驱动设计实战系列]专题三:前期准备之规约模式(Specification Pattern) 一、前言   在专题二中已经应用DDD和SOA的思想简单构建了一个网上书店的网站,接下来的专题中将会对该网站补充更多的DDD的内容。
1243 0
|
算法 C# 容器
C#设计模式(20)——策略者模式(Stragety Pattern)
原文:C#设计模式(20)——策略者模式(Stragety Pattern) 一、引言    前面主题介绍的状态模式是对某个对象状态的抽象,而本文要介绍的策略模式也就是对策略进行抽象,策略的意思就是方法,所以也就是对方法的抽象,下面具体分享下我对策略模式的理解。
1487 0
|
Java 数据库连接 数据库