写点什么

C# 关于多态性学习

作者:IC00
  • 2022-10-31
    湖南
  • 本文字数:2247 字

    阅读完需:约 7 分钟

C#  关于多态性学习

前言

我相信大家都对面向对象的三个特征封装、继承、多态很熟悉,每个人都能说上一两句,但是大多数都仅仅是知道这些是什么,今天这篇文章是对 C# 的多态性学习一下,巩固自己的基础,我们都知道同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性,那么我今天就来学一下,内容比较简单,希望大家勿喷,创作不易,大家顺便点点赞吧,你的点赞收藏关注,是我写文章的动力,栓 Q 啦。


C#多态性的概念

多态是面向对象编程中三大机制之一,其原理建立在"从父类继承而来的子类可以转换为其父类"这个规则之上,换句话说,能用父类的地方,就能用该类的子类.当从父类派生了很多子类时,由于每个子类都有其不同的代码实现,所以当用父类来引用这些子类时,同样的操作而可以表现出不同的操作结果,同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性。换句话说,实际上就是同一个类型的实例调用"相同"的方法,产生的结果是不同的。这里的"相同"打上双引号是因为这里的相同的方法仅仅是看上去相同的方法,实际上它们调用的方法是不同的。


C#多态性的学习

面向对象程序设计中的另外一个重要概念是 C#多态性。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。 可以把一组对象放到一个数组中,然后调用它们的方法,在这种场合下,多态性作用就体现出来了,这些对象不必是相同类型的对象。当然,如果它们都继承自某个类,你可以把这些派生类,都放到一个数组中。 如果这些对象都有同名方法,就可以调用每个对象的同名方法。本节课将向你介绍如何完成这些事情。

带有虚方法的基类:DrawingObject.cs

using System;  public class DrawingObject  {      public virtual void Draw()       {                 Console.WriteLine("I'm just a generic drawing object.");        }  }
复制代码


说明:定义了 DrawingObject 类。这是个可以让其他对象继承的基类。该类有一个名为 Draw()的方法。Draw()方法带有一个 virtual 修饰符,该修饰符表明:该基类的派生类可以重载该方法。DrawingObject 类的 Draw()方法完成如下事情:输出语句"I'm just a generic drawing object."到控制台。

带有重载方法的派生类:Line.cs, Circle.cs, and Square.cs

using System;public class Line : DrawingObject  {      public override void Draw()         {                  Console.WriteLine("I'm a Line.");         }  }   public class Circle : DrawingObject {      public override void Draw()     {           Console.WriteLine("I'm a Circle.");        }  }  public class Square : DrawingObject  {        public override void Draw()          {           Console.WriteLine("I'm a Square.");      }  }
复制代码


说明


定义了三个类。这三个类都派生自 DrawingObject 类。每个类都有一个同名 Draw()方法,这些 Draw()方法中的每一个都有一个重载修饰符。重载修饰符可让该方法在运行时重载其基类的虚方法,实现这个功能的条件是:通过基类类型的指针变量来引用该类。

实现 C# 多态性的程序:DrawDemo.cs

using System;public class DrawDemo  {           public static int Main(string[] args)          {             DrawingObject[] dObj = new DrawingObject[4];                  dObj[0] = new Line();               dObj[1] = new Circle();            dObj[2] = new Square();           dObj[3] = new DrawingObject();            foreach (DrawingObject drawObj in dObj)             {                    drawObj.Draw();              }                 return 0;        }  }
复制代码


说明演示了多态性的实现,该程序使用了在定义的类。在 DrawDemo 类中的 Main()方法中,创建了一个数组, 数组元素是 DrawingObject 类的对象。该数组名为 dObj,是由四个 DrawingObject 类型的对象组成。接下来, 初始化 dObj 数组, 由于 Line, Circle 和 Square 类都是 DrawingObject 类的派生类,所以这些类可以作为 dObj 数组元素的类型。 如果 C#没有这种功能,你得为每个类创建一个数组。继承的性质可以让派生对象当作基类成员一样用,这样就节省了编程工作量。一旦数组初始化之后,接着是执行 foreach 循环,寻找数组中的每个元素。在每次循环中, dObj 数组的每个元素(对象)调用其 Draw()方法。多态性体现在:在运行时,各自调用每个对象的 Draw()方法。尽管 dObj 数组中的引用对象类型是 DrawingObject,这并不影响派生类重载 DrawingObject 类的虚方法 Draw()。 在 dObj 数组中,通过指向 DrawingObject 基类的指针来调用派生类中的重载的 Draw()方法。


输出结果是:


I'm a Line.I'm a Circle.I'm a Square.I'm just a generic drawing object.
复制代码


在 DrawDemo 程序中,调用了每个派生类的重载的 Draw()方法。一行中,执行的是 DrawingObject 类的虚方法 Draw()。这是因为运行到,数组的第四个元素是 DrawingObject 类的对象。

总结

这篇文章比较简单,只是简单的学习一下,对它有更多的认识,在有需求的时候最起码有路子,虽然很简单,但是也是可以学到东西的,我们学习了新的知识,对我们的知识储备及技术又有新的一点点的进步,C#的技术就是先简单再难嘛,积少成多之后才会成长才会进步,我们要不断的学习不断的探索,才能有学习的动力,才会有学习的欲望,东西不多,但是实用性挺强建议收藏一下,哈哈哈哈,如果你觉得这篇文章对你有用,点赞最实在,创作不易,点赞评论收藏关注,嘿嘿,不喜勿喷!!!!



发布于: 刚刚阅读数: 3
用户头像

IC00

关注

一个热爱生活,喜欢拍照的热血青年 2022-07-14 加入

一个想学习技术的小盆友,想努力更文,争取今年发100篇

评论

发布
暂无评论
C#  关于多态性学习_C#_IC00_InfoQ写作社区