![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 using System; 2 using System.Collections.Generic; 3 namespace draw 4 { 5 public class Shape 6 { 7 public int x { get; private set; } 8 public int y { get; private set; } 9 public int Height { get; set; } 10 public int Width { get; set; } 11 public virtual void Draw() 12 { 13 Console.WriteLine("执行基类图的任务"); 14 } 15 } 16 class Circle : Shape 17 { 18 public override void Draw() 19 { 20 Console.WriteLine("画个圆"); 21 base.Draw(); 22 } 23 } 24 class Rectangle : Shape 25 { 26 public override void Draw() 27 { 28 Console.WriteLine("画一个矩形"); 29 base.Draw(); 30 } 31 } 32 class Triangle : Shape 33 { 34 public override void Draw() 35 { 36 Console.WriteLine("画一个三角"); 37 base.Draw(); 38 } 39 } 40 class Program 41 { 42 static void Main(string[] args) 43 { 44 /*泛型看不懂*/ 45 System.Collections.Generic.List<Shape> shapes = new System.Collections.Generic.List<Shape>(); 46 shapes.Add(new Rectangle()); 47 shapes.Add(new Triangle()); 48 shapes.Add(new Circle()); 49 foreach (Shape s in shapes) 50 { 51 s.Draw(); 52 } 53 Console.ReadKey(); 54 } 55 } 56 } 57 /*output: 58 画一个矩形 59 执行基类图任务 60 画一个三角形 61 执行基类图任务 62 画一个圆形 63 执行基类图任务 64 */
多态性常被视为自封装和继承之后,面向对象的编程的第三个支柱。Polymorphism(多态性)是一个希腊词,指“多种形态”,多态性具有两个截然不同的方面:
-
在运行时,在方法参数和集合或数组等位置,派生类的对象可以作为基类的对象处理。发生此情况时,该对象的声明类型不再与运行时类型相同。
-
基类可以定义并实现虚方法,派生类可以重写这些方法,即派生类提供自己的定义和实现。在运行时,客户端代码调用该方法,CLR 查找对象的运行时类型,并调用虚方法的重写方法。因此,您可以在源代码中调用基类的方法,但执行该方法的派生类版本。
虚方法允许您以统一方式处理多组相关的对象。例如,假定您有一个绘图应用程序,允许用户在绘图图面上创建各种形状。您在编译时不知道用户将创建哪些特定类型的形状。但应用程序必须跟踪创建的所有类型的形状,并且必须更新这些形状以响应用户鼠标操作。您可以使用多态性通过两个基本步骤解决这一问题:
-
创建一个类层次结构,其中每个特定形状类均派生自一个公共基类。
-
使用虚方法通过对基类方法的单个调用来调用任何派生类上的相应方法。
首先,创建一个名为 Shape 的基类,并创建一些派生类,例如 Rectangle、Circle 和 Triangle。为 Shape 类提供一个名为 Draw 的虚方法,并在每个派生类中重写该方法以绘制该类表示的特定形状。创建一个 List<Shape> 对象,并向该对象添加 Circle、Triangle 和 Rectangle。若要更新绘图图面,请使用 foreach 循环对该列表进行循环访问,并对其中的每个 Shape 对象调用 Draw 方法。虽然列表中的每个对象都具有声明类型 Shape,但调用的将是运行时类型(该方法在每个派生类中的重写版本)。