多态 (polymorphism) 一词最初来源于希腊语 polumorphos,含义是具有多种形式或形态的情形。在程序设计领域,一个广泛认可的定义是“一种将不同的特殊行为和单个泛化记号相关联的能力”。然而在人们的直观感觉中,多态的含义大约等同于“同一个方法对于不同类型的输入参数均能做出正确的处理过程,并给出人们所期望获得的结果”,也许这正体现了人们对于多态性所能达到的效果所寄予的期望:使程序能够做到越来越智能化,越来越易于使用,越来越能够使设计者透过形形色色的表象看到代码所要触及到的问题本质。
总体是分为通用多态和专用多态:
通用多态:不同的类型值,执行相同的代码。
专用多态:不同的类型值,执行不同的代码。(类似枚举 “什么类型,执行什么操作”)
通用多态分为:参数多态和包含多态
参数多态:参考c++中的template(静态联编时候实现)
包含多态:可以理解为abstract functions,interface的方法(动态联编时候实现,)
专用多态:强制多态和重载多态
强制多态:可以理解为类型的隐式转换(静态联编时候实现)
重载多态:参考C++中的函数重载的理解(静态联编时候实现)
概念:采用参数化模板,通过给出不同的类型实参,使得一个结构有多种类型。
概念:同样的操作可用于一个类型及其子类型。
例:Pascal 中的子界。子类型:a value of a subtype can be used everywhere a value of the supertype can be expected.
注意:子类型与将来要介绍的子类是有区别的。包含多态一般需要进行运行时的类型检查。
概念:同一个名(操作符、函数名)在不同的上下文中有不同的类型。
程序设计语言中基本类型的大多数操作符都是过载多态的。
概念:编译程序通过语义操作,把操作对象的类型强行加以变换,以符合函数或操作符的要求。
老师要求我们用C语言的一条语句实现四种多态,想了半天,只能这样写了,下面是代码,可能理解上有出入,包含多态的语句不太确定的是。
#include <stdio.h> enum dataType { INT, DOUBLE, CHAR, }; int f(void *a,int dataType){//这里实现了参数多态的函数! switch (dataType){ case 1: { int x=*(int*)a; break; } case 2: { char x=*(char*)a; break; } case 3: { double x=*(double*)a; break; } } return 0; } void main (){ int i=1; double j=2.0; float a=3.0,b=4.0;//double的子类型 double c=5.0,d=6.0; printf("参数多态%d,%d\n包含多态%lf,%lf\n过载多态%f,%lf\n强制多态%lf\n",sizeof(int),c*d,a*b,(1+2),(1.0+2.0),1); //本条语句分别实现了参数、包含、过载、强制多态 }
这里要讲的是参数多态,虽然觉得实现起来用处不大,但是至少C可以实现。主要用到的是void,几乎所有讲授 C 语言课程的老师都会告诉你:“指针是整个 C 语言的精髓所在。”而你也一直敬畏着指针,又爱又恨地使用着它。许多教材都告诉你,int * 叫做指向整型的指针,而 char * 是指向字符型的指针,等等不一而足。然而这里有一个另类的指针家族成员—— void *。不要按照通常的命名方式叫它做指向 void 类型的指针,它的正式的名字叫做:可以指向任意类型的指针。你一定注意到了“任意类型”这四个字,没错,实现多态,我们靠的就是它。
在其他网站上看到一个C语言实现的参数多态,可以借鉴,地址是http://www.ibm.com/developerworks/cn/linux/l-cn-cpolym/
这里就先写到这里,有机会再补充~