转载:面向对象语言中实现多态方法

多态即“多种状态”,是面向对象设计中的一种重要的特征,在面向对象语言中多态的实现方法也有很多种。这里主要以C++和C#为例,总结一下实现多态的几种方法。

1.继承实现多态

通过继承来使子类对象拥有更多区别于父类对象的属性和方法。

C++:中允许多重继承出现

C#:只有单根继承。用到关键字override和base分别对基类中的方法进行重写和调用

举例:以C#为例

[csharp]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. class Employee()//父类  
  2. {  
  3. publicvirtual void EmpInfo()  //virtual关键字的使用  
  4. {  
  5. console.WriteLine("此方法显示员工信息!");  
  6. }  
  7. }  
  8. classDerEmployee:Employee  
  9. {  
  10. publicoverride void EmpInfo()  
  11. {  
  12. base.EmpInfo();//调用基类的构造函数  
  13. console.WriteLine("此方法重写基类方法")//实现对基类方法的重写即实现多态  
  14. }  
  15. }  

[csharp]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. <p style="margin:0in;font-family:Calibri;font-size:14.0pt">  
  2. </p>  
2 .方法重载实现多态

这里的方法重载,与上面的继承中的方法重载,强调的环境不一样,其实是一个道理。只不过,这里更加强调函数的参数类型和个数的不同。(C#和C++中都支持)

例如:

[csharp]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. public int sum(int a,int b);  
[csharp]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. public double sum(double i,double j);  
[csharp]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. public int sum(int a,int b,int k);  
利用这种方法实现的重载,必须注意一下方面:

1.方法名必须相同

2.可以通过参数类型不同和参数个数不同实现重载

3.不能通过返回类型不同来实现

3.运算符重载实现多态

这里运算符重载,我觉得是一个难点。我理解的是:举个例子:我们定义了两个变量x,y,我们说value=x+y。可是,我把x,y分别换成vect1,vect2,如果没有事先声明,二者是不可以进行相加的。这个时候,我们利用运算符重载,就可以让二者相加,实现重载(C++和C#中都支持)

[csharp]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. class Vector  
  2. {  
  3. publicdouble x;  
  4. publicdouble y;  
  5. Vector(doublex,double y)  
  6. {  
  7. this->x=x;  
  8. this->y=y;  
  9. }  
  10. Vectoroperator +(Vector A,Vector B) //通过对'+'运算符重载实现多态  
  11. {  
  12. returnVector(A.x+B.x,A.y+B.y);  
  13. }  
  14. }  

[csharp]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. <p style="margin:0in;font-family:Calibri;font-size:14.0pt">  
  2. </p>  

[csharp]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1.   

在使用运算符重载时,对于比较运算符:=/!=,>/<=,</>=,在C#中要求必须成对重载。

4.抽象类和虚函数实现多态

关于这一点,在C++中和C#中在声明时是有些不同的。

抽象类的声明都用了abstract关键字。利用抽象方法实现多态

虚函数:都用到了virtual关键字,C#中在对对象进行重写时还用到了override关键字。

C++中利用虚函数初始化为0来声明纯虚函数 。

[csharp]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. //虚函数  
  2. class A  
  3.     {  
  4.         public virtual void Sum()   
  5.         {  
  6.             Console.WriteLine("I am AClass,I am virtual sum().");  
  7.         }  
  8.     }  
  9.     class B : A      
  10.     {  
  11.         public override void Sum() //重新实现了虚函数     
  12.         {  
  13.             Console.WriteLine("I am BClass,I am override sum().");  
  14.         }   
  15.    
  16.     }  
  17. //抽象类  
  18. abstract  class Shape  
  19. {  
  20. abstract public int Area();  
  21. }  
  22. classSquare:Shape  
  23. {  
  24. int x,y;  
  25. public override int Area()  
  26. {  
  27. return x*y;  
  28. }  
  29. }  


[csharp]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. <p style="margin:0in;font-family:宋体;font-size:8.0pt;color:#595959">  
  2. </p>  
5.通过接口实现多态

通过定义一个接口,在类中写明具体的实现方法。从而实现多态。由于在C#中是不允许多重继承的。我们不能通过多重继承来实现多态,但是C#中是允许多重接口实现的。

[csharp]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. interface IPict  
  2. {  
  3. publicint deleteImage();  //只有方法声明,没有实现  
  4. publicvoid displayImage();  
  5. }  
  6. public class MyImage  
  7. {  
  8. publicint deleteImage()  
  9. {  
  10. console.WriteLine("删除图像");  
  11. }  
  12. publicvoid displyImage()  
  13. {  
  14. console.WriteLine("显示图片!");  
  15. }  
  16. }  

[csharp]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. <p style="margin:0in;font-family:Calibri;font-size:14.0pt">  
  2. </p>  
通过在程序中利用多态,我们可以使我们的程序更加灵活,通过上述总结,可见,多态的实现不止一种方法。更加深入的应用还有待以后的学习和积累。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值