龙生九子

发布时间: 2007-05-21 09:44    作者: 未知    来源: 未知    浏览:    评论

龙生九子

                  ----多态

作者:HolyFire

一龙生九子,子子皆不同。这个道理说的是世界上没有两个或两个以上的事物是完全相同的,事物之间有相同相似的一面,当然也有不同相异的一面。只有将不同的和相同的都考虑进来,才能完整的表达事物。

事物的属性有着不同的一面。我们知道人感知事物的一个途径是观察,用对不同光线的反应来识别物体,所以我们给出事物的一个属性,颜色。有时候一些物体的颜色是固定的,白色的云,蔚蓝的天空,碧绿的草地,不禁令人神游太虚。

但有些方面是不确定的,有一句话说道:“月有阴晴圆缺,人有悲欢离合”,这句话还不足以说明这个道理。我们中文里有时候会省略一些部分,“今天你吃了没有?”吃的是什么,“早饭”,“下午茶”,“面包”,不知道。这里将吃东西抽象化了,这句话可以在早上说,中午说,晚上说,任何一个适合的时间段都可以说。感兴趣的地方出现了,我们不知道吃什么东西,什么时候吃,但是却可以使用它,简要的表达一下你的问候。这样简单的设下伏笔,在具体需要的环境才用具体表现出来具体的用法,被广泛运用在生活中。“我砍!”表达了一个人要做的动作,具体砍什么,只有感兴趣的人才会去关注。“我生病了。”表达了一个人的状态,具体生的什么病,不是人人都想知道的。

多态--就是指事物不同的方面

多态是一种复杂的应用,要全面的阐述它很难,所以理解它的思想就成了重点。在不同情况下,秉承它的思想,用不同的方法实现多态。

还记得C++中的虚函数吗,我在《后入为主----虚函数》中讲过,虚函数可以动态改变,运用这个特性就能实现我们的目的了。不同的语言使用不同的方法,实现的机制就是一个类型提供的接口可以改变。这样就能体现不同这个思想了。

为了更好理解,我们用C++实现一个例子。

我们知道,要生活,就要工作,工作是人的社会行为,几乎人人都在工作。世界上有形形色色的人,人的工作的区分在什么地方呢,那就是它的职业,不同职业的人做不同的事。

学生的工作就是学习,司机的工作是开车,小贩的工作是卖商品,程序员的工作是编写代码。

现在我们分析一下,世界上有很多人,人都要工作

人 { 工作 = 未确定 }

学生的工作是学习

学生 { 人 , 工作 = 学习 }

司机的工作是开车

司机 { 人 , 工作 = 开车 }

小贩的工作是贩卖

小贩 { 人 , 工作 = 贩卖 }

程序员的工作是编程

程序员 { 人 , 工作 = 编程 }

#include <iostream>

unsing namespace std;

class Man{

public:

    virtual void Work( void ) = 0;//纯虚函数,没有确定的职业就不知道他的工作。

};

class Student : public Man{

public:

    void Work( void ) { cout << "I'm Learning."<< endl; };

};

class Chauffeur : public Man{

public:

    void Work( void ) { cout << "I'm Driving."<< endl; };

};

class Vendor : public Man{

public:

    void Work( void ) { cout << "I'm Vending."<< endl; };

};

class Programer : public Man{

public:

    void Work( void ) { cout << "I'm Coding."<< endl; };

};

void main()

{

    Man * which[5];

    which[0] = new Student;

    which[1] = new Chauffeur;

    which[2] = new Vendor;

    which[3] = new Programer;

        which[4] = NULL;

    for( int i = 0 ; which[i] ; i++ )

       {

        which[i]->Work();

        delete which[i];

       }

}

运行结果

I'm Learning. //虚函数表指针指向的Student的虚函数表

I'm Driving.  //虚函数表指针指向的Chauffeur的虚函数表

I'm Vending.  //虚函数表指针指向的Vendor的虚函数表

I'm Coding.   //虚函数表指针指向的Programer的虚函数表

我们看到了由于使用了虚函数,类增加了虚函数表和虚函数表指针

which[0] = new Student;

我们分析这个指针,他指向一个Student对象,而这个指针描述的是一个Man对象,在Student对象被创建的时候虚函数表指针指向了Student的虚函数表,所以which[0]->Work();调用的是在Student的虚函数表里查出来的Student::Work();其它的以此类推,不难得到运行的结果。

不同职业的类用同一个接口实现了不同功能,我们的目的达到了,代码很简洁,意图很明显,这里C++又一次很好的实现了面向对象的思想。
上一篇 白马非马 下一篇 由始至终

TAG

Smile Big Smile Surprise Stick out tongue Wink Sad Tongue Tied Indifferent Crying Embarrassed Cool Angry Angel Devil [8-|] [:#] [:-*] [:^)] [<:o)] [|-)] Yes Beer Left Hug Music Star Time Snail Pizza Automobile Umbrella Computer Storm [mo] [8o|] [^o)] [+o(] [*-)] [8-)] Coffee No Drinks [Z] Right Hug Cake Broken Heart Gift Wilted Flower Movie Dog Idea Sleep Email Travel Paradise
呢称:

加粗 斜体 下划线 链接 图片 代码 邮件地址 引用 列表

最多只能输入100个字符

Tags

SQL 数据库 asp.net C# XML 控件 .NET教程 程序 事件 数据 安全 代码 Server 客户端 验证 数据库专栏 接口 文件 Oracle DataSet 函数 DataGrid 问题 .net return C#语言 JavaScript 服务 IIS 对象 语句 windows 继承 时间 web.config 设计 开发 参数 变量 解决 字符 ADO.net 环境 VB.Net语言 web 异常 工具 服务器 计算 实例 OLEDB Application VB Word WebService insert asp net 安装 记录

精华推荐

更多

精品下载

更多