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: