你的位置:首页 > 软件开发 > ASP.net > 浅谈C# 多态的法力

浅谈C# 多态的法力

发布时间:2016-03-03 13:00:05
前言:我们都知道面向对象的三大特性:封装,继承,多态。封装和继承对于初学者而言比较好理解,但要理解多态,尤其是深入理解,初学者往往存在有很多困惑,为什么这样就可以?有时候感觉很不可思议,由此,面向对象的魅力体现了出来,那就是多态,多态用的好,可以提高程序的扩展性。常用的设计模式, ...

前言:我们都知道get='_blank'>面向对象的三大特性:封装,继承,多态。封装和继承对于初学者而言比较好理解,但要理解多态,尤其是深入理解,初学者往往存在有很多困惑,为什么这样就可以?有时候感觉很不可思议,由此,面向对象的魅力体现了出来,那就是多态,多态用的好,可以提高程序的扩展性。常用的设计模式,比如简单工厂设计模式,核心就是多态。

其实多态就是:允许将子类类型的指针赋值给父类类型的指针。也就是同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。如果这边不理解可以先放一放,先看下面的事例,看完之后再来理解这句话,就很容易懂了。

  /// <summary>  /// 鸟类:父类  /// </summary>  public class Bird  {    /// <summary>    /// 吃:虚方法    /// </summary>    public virtual void Eat()    {      Console.WriteLine("我是一只小小鸟,我喜欢吃虫子~");    }  }
浅谈C# 多态的法力

创建子类Magpie如下,继承父类Bird,重写父类Bird中的虚方法Eat():

浅谈C# 多态的法力
  /// <summary>  /// 老鹰:子类  /// </summary>  public class Eagle:Bird  {    /// <summary>    /// 重写父类中Eat方法    /// </summary>    public override void Eat()    {      Console.WriteLine("我是一只老鹰,我喜欢吃肉~");    }  }
浅谈C# 多态的法力

创建一个子类Penguin如下,继承父类Bird,重写父类Bird中的虚方法Eat():

浅谈C# 多态的法力
  static void Main(string[] args)  {    //创建一个Bird基类数组,添加基类Bird对象,Magpie对象,Eagle对象,Penguin对象    Bird[] birds = {            new Bird(),            new Magpie(),            new Eagle(),            new Penguin()    };    //遍历一下birds数组    foreach (Bird bird in birds)    {      bird.Eat();    }    Console.ReadKey();  }
浅谈C# 多态的法力

运行结果:

浅谈C# 多态的法力

由此可见,子类Magpie,Eagle,Penguin对象可以赋值给父类对象,也就是说父类类型指针可以指向子类类型对象,这里体现了里氏替换原则。

父类对象调用自己的Eat()方法,实际上显示的是父类类型指针指向的子类类型对象重写父类Eat后的方法。这就是多态。

多态的作用到底是什么呢?

  /// <summary>  /// 鸟类:基类  /// </summary>  public abstract class Bird  {    /// <summary>    /// 吃:抽象方法    /// </summary>    public abstract void Eat();  }
浅谈C# 多态的法力

抽象类Bird内添加一个Eat()抽象方法,没有方法体。也不能实例化。

    static void Main(string[] args)    {      //创建一个Bird基类数组,添加 Magpie对象,Eagle对象,Penguin对象      Bird[] birds = {              new Magpie(),              new Eagle(),              new Penguin()      };      //遍历一下birds数组      foreach (Bird bird in birds)      {        bird.Eat();      }      Console.ReadKey();    }
浅谈C# 多态的法力

执行结果:

浅谈C# 多态的法力

由此可见,我们选择使用虚方法实现多态还是抽象类抽象方法实现多态,取决于我们是否需要使用基类实例化的对象.

比如说 现在有一个Employee类作为基类,ProjectManager类继承自Employee,这个时候我们就需要使用虚方法来实现多态了,因为我们要使用Employee创建的对象,这些对象就是普通员工对象。

  /// <summary>  /// 飞 接口  /// </summary>  public interface IFlyable  {    void Fly();  }
浅谈C# 多态的法力

喜鹊Magpie实现IFlyable接口,代码如下:

浅谈C# 多态的法力
  /// <summary>  /// 老鹰:子类实现飞接口  /// </summary>  public class Eagle:Bird,IFlyable  {    /// <summary>    /// 重写父类Bird中Eat方法    /// </summary>    public override void Eat()    {      Console.WriteLine("我是一只老鹰,我喜欢吃肉~");    }    /// <summary>    /// 实现 IFlyable接口方法    /// </summary>    public void Fly()    {      Console.WriteLine("我是一只老鹰,我可以飞哦~~");    }  }
浅谈C# 多态的法力

在Main主函数中,创建一个IFlyable接口数组,代码实现如下:

浅谈C# 多态的法力
  /// <summary>  /// 飞机类,实现IFlyable接口  /// </summary>  public class Plane:IFlyable  {    /// <summary>    /// 实现接口方法    /// </summary>    public void Fly()    {      Console.WriteLine("我是一架飞机,我也能飞~~");    }  }
浅谈C# 多态的法力

在Main主函数中,接口IFlyable数组,添加Plane对象:

浅谈C# 多态的法力
  /// <summary>  /// 计算父类  /// </summary>  public abstract class Calculate  {    public int Number1    {      get;      set;    }    public int Number2    {      get;      set;    }    public abstract int Compute();  }
浅谈C# 多态的法力

接下来,我们添加一个加法器,继承计算Calculate父类:

浅谈C# 多态的法力
  /// <summary>  /// 减法器  /// </summary>  public class Subtraction : Calculate  {    /// <summary>    /// 实现父类计算方法    /// </summary>    /// <returns>减法计算结果</returns>    public override int Compute()    {      return Number1 - Number2;    }  }
浅谈C# 多态的法力

在主窗体FormMain中,编写计算事件btn_Compute_Click,代码如下:

浅谈C# 多态的法力
  /// <summary>  /// 乘法计算器  /// </summary>  public class Multiplication:Calculate  {    public override int Compute()    {      return Number1*Number2;    }  }
浅谈C# 多态的法力

然后在GetCalculateResult函数中添加一个case 就好了:

浅谈C# 多态的法力

原标题:浅谈C# 多态的法力

关键词:C#

C#
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

可能感兴趣文章

我的浏览记录