多态即“多种状态”,是面向对象设计中的一种重要的特征,在面向对象语言中多态的实现方法也有很多种。这里主要以C++和C#为例,总结一下实现多态的几种方法。
1.继承实现多态
通过继承来使子类对象拥有更多区别于父类对象的属性和方法。
C++:中允许多重继承出现
C#:只有单根继承。用到关键字override和base分别对基类中的方法进行重写和调用
举例:以C#为例
- class Employee()//父类
- {
- publicvirtual void EmpInfo() //virtual关键字的使用
- {
- console.WriteLine("此方法显示员工信息!");
- }
- }
- classDerEmployee:Employee
- {
- publicoverride void EmpInfo()
- {
- base.EmpInfo();//调用基类的构造函数
- console.WriteLine("此方法重写基类方法")//实现对基类方法的重写即实现多态
- }
- }
- <p style="margin:0in;font-family:Calibri;font-size:14.0pt">
- </p>
这里的方法重载,与上面的继承中的方法重载,强调的环境不一样,其实是一个道理。只不过,这里更加强调函数的参数类型和个数的不同。(C#和C++中都支持)
例如:
- public int sum(int a,int b);
- public double sum(double i,double j);
- public int sum(int a,int b,int k);
1.方法名必须相同
2.可以通过参数类型不同和参数个数不同实现重载
3.不能通过返回类型不同来实现
3.运算符重载实现多态
这里运算符重载,我觉得是一个难点。我理解的是:举个例子:我们定义了两个变量x,y,我们说value=x+y。可是,我把x,y分别换成vect1,vect2,如果没有事先声明,二者是不可以进行相加的。这个时候,我们利用运算符重载,就可以让二者相加,实现重载(C++和C#中都支持)
- class Vector
- {
- publicdouble x;
- publicdouble y;
- Vector(doublex,double y)
- {
- this->x=x;
- this->y=y;
- }
- Vectoroperator +(Vector A,Vector B) //通过对'+'运算符重载实现多态
- {
- returnVector(A.x+B.x,A.y+B.y);
- }
- }
- <p style="margin:0in;font-family:Calibri;font-size:14.0pt">
- </p>
在使用运算符重载时,对于比较运算符:=/!=,>/<=,</>=,在C#中要求必须成对重载。
4.抽象类和虚函数实现多态
关于这一点,在C++中和C#中在声明时是有些不同的。
抽象类的声明都用了abstract关键字。利用抽象方法实现多态
虚函数:都用到了virtual关键字,C#中在对对象进行重写时还用到了override关键字。
C++中利用虚函数初始化为0来声明纯虚函数 。
- //虚函数
- class A
- {
- public virtual void Sum()
- {
- Console.WriteLine("I am AClass,I am virtual sum().");
- }
- }
- class B : A
- {
- public override void Sum() //重新实现了虚函数
- {
- Console.WriteLine("I am BClass,I am override sum().");
- }
- }
- //抽象类
- abstract class Shape
- {
- abstract public int Area();
- }
- classSquare:Shape
- {
- int x,y;
- public override int Area()
- {
- return x*y;
- }
- }
- <p style="margin:0in;font-family:宋体;font-size:8.0pt;color:#595959">
- </p>
通过定义一个接口,在类中写明具体的实现方法。从而实现多态。由于在C#中是不允许多重继承的。我们不能通过多重继承来实现多态,但是C#中是允许多重接口实现的。
- interface IPict
- {
- publicint deleteImage(); //只有方法声明,没有实现
- publicvoid displayImage();
- }
- public class MyImage
- {
- publicint deleteImage()
- {
- console.WriteLine("删除图像");
- }
- publicvoid displyImage()
- {
- console.WriteLine("显示图片!");
- }
- }
- <p style="margin:0in;font-family:Calibri;font-size:14.0pt">
- </p>