在软考学习的时候,才发现多态不仅仅只有我认识的那么一两种,很多用过的形式原来它们也是多态呀。
首先来看下大图:
接下来本文将一一举例这些多态,并在末尾做个小对比。
一,简介几种多态
1,泛型
这个听起来比较高大上,但是大家都用过,例如:
机房收费系统——组合查询中,为了尽可能抽出相同部分,使用T代替。还有转换成list的时候,在定义中指定List of T,使用时:
mylist = Entity.EntityConverter.convertToList(Of Entity.StuBaseInfo)(dt)
2,模板
这个在C++中见的很多,别的语言中还没有用过,所以就用C++举例了:
template <typename T> T max(const T& lsh, const T& rhs) { return (lsh > rhs) ? lsh : rhs; } //返回两个任意类型对象的最大值(对象),前提是该类型能够使用> //运算符进行比较,并且返回值是bool类型。 //使用: int a = 3; int b = 4; cout << max(a, b) << endl; float c = 2.4; float d = 1.2; cout << max(c, d) << endl; //输出结果为: //4 //2.4
同样是使用时指定T,但是泛型比模板多了对参数的检查功能。
3,重写
面向对象中,最常见的就是一个子类继承一个父类,然后重写它的方法了:
例如:一个类继承一个窗体,然后重写它按钮的点击事件:
4,重载
适用于一个功能有多个参数的情况:
#include<iostream> #include<cstring> using namespace std; int myMax(int x,int y); //比较两个整数 char myMax(char first,char second); //比较两个字符 double myMax(double u,double v); //比较两个小数 char * myMax(char * frist,char * second); //比较两个字符串 int main() //主函数 { cout<<"in 3 and 5,the max number is "<<myMax(3,5)<<endl; //调用比较整数的函数 cout<<"in c and t the max char is:"<<myMax('c','t')<<endl; //调用比较字符的函数 cout<<"in 3.1 and -5.3,the max double number is:"<<myMax(3.1,-5.3)<<endl; //调用比较浮点数的函数 cout<<"in what and where the max string is:"<<myMax("what","where")<<endl; //调用比较字符的函数 } //下面为函数体 int myMax(int x,int y) //比较两个整数 { if(x>y) return x; else return y; } char myMax(char first,char second) //比较两个字符 { if(first>second) return first; else return second; } double myMax(double u,double v) //比较两个小数 { if(u>v) return u; else return v; } char * myMax(char * first,char * second) //比较两个字符串 { if(strcmp(first,second)>0) return first; else return second; }
5,父类引用指向子类对象
超级熟悉了吧,设计模式中用的最多的,自我感觉不仅是用的最多的,也是最好用的,举个例子:
<span style="font-size:18px;"> Animal a=new Dog(); </span>
二,小结