- ·上一篇文章:用好加密防止别人监听你的MSN
- ·下一篇文章:四人跳棋行棋原则及战术特点
深入浅出话多态(上)—具体而微
小序
前几天写了一篇《深入浅出话委托》,很多兄弟姐妹发Mail说还算凑合,又有兄弟说能不能写一篇类似的文章,讲解一下什么是“多态”。一般情况下我写文章都是出于有感而发:一来做个思考的总结(怕时间长了就忘记了),二来与大家分享一下。“多态”实在是个大概念,我没有仔细研究过,更不消说在实践中有深入的使用,所以本文纯属硬着头皮上——如果内容有什么闪失,请大家别客气——猛拍砖就是了。
上面一段是前几天写的!昨天晚上看了巴西进八强的比赛,我虽然是个绝对的伪球迷,但我也能看出来人家肥罗的球技啊!人家的意识,丝毫不像是在踢世界杯,纯粹就是表演……台上三分钟,台下十年功啊!我们一起练程序,就要把代码写到这个程度,让我们一起无限量提高自己的技术吧!
正文
一.什么是多态(Polymorphism)
多态(Polymorphism)是面向对象(Object-Oriented,OO)思想“三大特征”之一,其余两个分别是封装(Encapsulation)和继承(Inheritance)——可见多态的重要性。或者说,不懂得什么是多态就不能说懂得面向对象。
多态是一种机制、一种能力,而非某个关键字。它在类的继承中得以实现,在类的方法调用中得以体现。
先让我们看看MSDN里给出的定义:
Through inheritance, a class can be used as more than one type; it can be used as its own type, any base types, or any interface type if it implements interfaces. This is called polymorphism. In C#, every type is polymorphic. Types can be used as their own type or as a Object instance, because any type automatically treats Object as a base type.
译文:通过继承,一个类可以被当作不止一个数据类型(type)使用,它可以被用做自身代表的数据类型(这是最常用的),还可以被当作它的任意基类所代表的数据类型,乃至任意接口类型——前提是这个类实现了这个接口。这一机制称为“多态”。在C#中,所有的数据类型都是多态的。任意一个数据类型都可以被当作自身来使用,也可以当作Object类型来使用(我怀疑原文有问题,那个instance可能是原作者的笔误),因为任何数据类型都自动以Object为自己的基类。
呵呵,除非你已经早就知道了什么是多态然后翻过头来看上面一段话,不然我敢打保票——我是清清楚楚的,你是稀里糊涂的。OK,不难为大家了,我用几个句子说明一下多态的思想。
我们先把前文中提到的“接口”理解为“一组功能的集合”,把“类”理解为功能的实现体。这样的例子多了去了。我们就拿生物界做比喻了:
功能集合1:呼吸系统
功能集合2:血液循环系统
功能集合3:神经系统
功能集合4:语言系统
类1:灵长类动物。此类实现了1到3功能集合。
类2:猴子类。继承自类1。新添加了“爬树”的功能。
类3:人类。继承自类1。同时实现了功能集合4。
类4:男人类。继承自类3。新添加了“写程序”的功能。
类5:女人类。继承自类3。新添加了“发脾气”的功能。
作业:请大家把上面的关系用图画出来
OK,让我们看下面的话,判断对错:
1. 男人是男人 (√) 原因:本来就是!
2. 男人是人 (√) 原因:人类是男人类的基类
3. 男人是灵长类动物 (√) 原因:灵长类是男人类的更抽象层基类
4. 男人是会说话的 (√) 原因:男人类的基类实现了语言系统
5. 女人是猴子 (×) 原因:如果我这么说,会被蹁死
6. 猴子是女人 (×) 原因:女人不是猴子的基类
7. 人会写程序 (×) 原因:写程序方法是在男人类中才具体实现的
8. 女人会发脾气 (√) 原因:因为我说5……
前几天写了一篇《深入浅出话委托》,很多兄弟姐妹发Mail说还算凑合,又有兄弟说能不能写一篇类似的文章,讲解一下什么是“多态”。一般情况下我写文章都是出于有感而发:一来做个思考的总结(怕时间长了就忘记了),二来与大家分享一下。“多态”实在是个大概念,我没有仔细研究过,更不消说在实践中有深入的使用,所以本文纯属硬着头皮上——如果内容有什么闪失,请大家别客气——猛拍砖就是了。
上面一段是前几天写的!昨天晚上看了巴西进八强的比赛,我虽然是个绝对的伪球迷,但我也能看出来人家肥罗的球技啊!人家的意识,丝毫不像是在踢世界杯,纯粹就是表演……台上三分钟,台下十年功啊!我们一起练程序,就要把代码写到这个程度,让我们一起无限量提高自己的技术吧!
正文
一.什么是多态(Polymorphism)
多态(Polymorphism)是面向对象(Object-Oriented,OO)思想“三大特征”之一,其余两个分别是封装(Encapsulation)和继承(Inheritance)——可见多态的重要性。或者说,不懂得什么是多态就不能说懂得面向对象。
多态是一种机制、一种能力,而非某个关键字。它在类的继承中得以实现,在类的方法调用中得以体现。
先让我们看看MSDN里给出的定义:
Through inheritance, a class can be used as more than one type; it can be used as its own type, any base types, or any interface type if it implements interfaces. This is called polymorphism. In C#, every type is polymorphic. Types can be used as their own type or as a Object instance, because any type automatically treats Object as a base type.
译文:通过继承,一个类可以被当作不止一个数据类型(type)使用,它可以被用做自身代表的数据类型(这是最常用的),还可以被当作它的任意基类所代表的数据类型,乃至任意接口类型——前提是这个类实现了这个接口。这一机制称为“多态”。在C#中,所有的数据类型都是多态的。任意一个数据类型都可以被当作自身来使用,也可以当作Object类型来使用(我怀疑原文有问题,那个instance可能是原作者的笔误),因为任何数据类型都自动以Object为自己的基类。
呵呵,除非你已经早就知道了什么是多态然后翻过头来看上面一段话,不然我敢打保票——我是清清楚楚的,你是稀里糊涂的。OK,不难为大家了,我用几个句子说明一下多态的思想。
我们先把前文中提到的“接口”理解为“一组功能的集合”,把“类”理解为功能的实现体。这样的例子多了去了。我们就拿生物界做比喻了:
功能集合1:呼吸系统
功能集合2:血液循环系统
功能集合3:神经系统
功能集合4:语言系统
类1:灵长类动物。此类实现了1到3功能集合。
类2:猴子类。继承自类1。新添加了“爬树”的功能。
类3:人类。继承自类1。同时实现了功能集合4。
类4:男人类。继承自类3。新添加了“写程序”的功能。
类5:女人类。继承自类3。新添加了“发脾气”的功能。
作业:请大家把上面的关系用图画出来
OK,让我们看下面的话,判断对错:
1. 男人是男人 (√) 原因:本来就是!
2. 男人是人 (√) 原因:人类是男人类的基类
3. 男人是灵长类动物 (√) 原因:灵长类是男人类的更抽象层基类
4. 男人是会说话的 (√) 原因:男人类的基类实现了语言系统
5. 女人是猴子 (×) 原因:如果我这么说,会被蹁死
6. 猴子是女人 (×) 原因:女人不是猴子的基类
7. 人会写程序 (×) 原因:写程序方法是在男人类中才具体实现的
8. 女人会发脾气 (√) 原因:因为我说5……


