多态即“多种状态”,是面向对象设计中的一种重要的特征,在面向对象语言中多态的实现方法也有很多种。这里主要以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("此方法重写基类方法")//实现对基类方法的重写即实现多态 } }
2 .方法重载实现多态
这里的方法重载,与上面的继承中的方法重载,强调的环境不一样,其实是一个道理。只不过,这里更加强调函数的参数类型和个数的不同。(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); } }
在使用运算符重载时,对于比较运算符:=/!=,>/<=,</>=,在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; } }
5.通过接口实现多态
通过定义一个接口,在类中写明具体的实现方法。从而实现多态。由于在C#中是不允许多重继承的。我们不能通过多重继承来实现多态,但是C#中是允许多重接口实现的。
interface IPict { publicint deleteImage(); //只有方法声明,没有实现 publicvoid displayImage(); } public class MyImage { publicint deleteImage() { console.WriteLine("删除图像"); } publicvoid displyImage() { console.WriteLine("显示图片!"); } }
通过在程序中利用多态,我们可以使我们的程序更加灵活,通过上述总结,可见,多态的实现不止一种方法。更加深入的应用还有待以后的学习和积累。