多态

来自计算思维百科
跳转至: 导航搜索
多态性.png

我们知道自然界中很多事务具有继承关系,例如,猫、狗、鸭子是动物这个抽象概念下的小概念,他们继承了动物的各种属性和行为,例如动物都会叫,“叫”是一个动物行为,但是猫、狗、鸭子叫声是不一样的,我们不需要对这三种叫声写三个不同的函数来描述,而是用一个统一的函数“叫”来描述。那么如何区分是猫的“叫”,而不是狗的“叫”,这个就可以利用多态性来实现。

多态性就是指对象的多种状态,是继承机制中的一种特性。

基本概念

多态是面向对象程序设计的重要特征之一,是扩展性在“继承”之后的又一重大表现 。对象根据所接受的消息而做出动作,同样的消息被不同的对象接受时可能导致完全不同的行为,这种现象称为多态性。例如,我们前面提到的叫声的问题,猫、狗、鸭子这些对象继承了“动物”对象,当“叫”这个动作作用于猫时,发出“喵”的声音,而“叫”这个动作作用于狗时,发出“汪”的声音,也就是同意操作作用于不同类型的对象时,将产生不同的执行结果。当时这个动作的名字是相同的,都是“叫”。

多态性存在的意义就在于,当不同的类(猫、狗、鸭子)的某种行为(“叫”)不同的时候,如果每个类的这个行为都要单独进行处理,例如,用“猫叫”“狗叫”“鸭叫”描述三种叫声,那将会非常不利于代码的维护,类内部实现和应用程序都需要进行修改,碰到猫叫的行为,就调用“猫叫”,碰到狗叫的行为,就调用“狗叫”,这样的话,代码就会很多,对象的封装性不好,面向对象的优越性便会减少,又回到了面向过程的老路上去了。

应用案例

应用1-不同的自我介绍

案例:

李先生和小李是父子关系,我们这里将李先生看做父类,小李看做子类,李先生的自我介绍就是“你好,我是李三,很高兴见到你。”通过继承关系,小李也获得了自我介绍的行为(函数),但是小李的自我介绍不能也同他父亲一样也叫李三,他有他自己的名字,他的自我介绍就要说“你好,我是李明,很高兴见到你。”

因此就要对自我介绍这个函数进行重载,当 小李的自我介绍()函数调用的时候就会出现“你好,我是李明,很高兴见到你。”当 李先生的自我介绍()函数调用的时候就会出现“你好,我是李三,很高兴见到你”。

应用2- 美国人口味的多态性

案例:

在美国的餐厅里,普遍的情况就是很多美国人每次都喜欢点他们最喜欢的菜,不轻易进行改变,而且他们非常喜欢去同一家店吃同一道菜,因此很多服务生都记住了每个顾客的名字和他们爱吃的菜,当他们光顾的时候就会说“老样子!”,这时候服务生就会端上他们各自喜欢的那道菜,这样服务生也会得到较多的小费。

这里的就是一种多态性的体现,面对不同的对象,同样的函数名“老样子!”执行了不同的指令。

可以体现的计算思维

多态性体现了计算思维中的抽象特点,把同一函数的多种功能用一个函数名表达出来,可以减少很多代码,使表达非常简洁。