C# 多态
多态(dynamic):三要素
继承,实现,父类引用指向子类(向上类型转换Upcast)
多态特性
1.它是运行期,谁New出来的就调用谁里面的方法和属性
2.一个类存在多种状态
3.多态它是在运行期才确定去调用那个方法的(相当于说是晚绑定)
应用场景
比如说:我们要做一个画图软件,里面当然可以画。正方形,长方形,圆形....等等。这些形状了。
面象对象思维分析:正方形,长方形,圆形。它一定有同共的属性的方法,比如说属性有:颜色,长度,高度...。而方法它们都有:画(Draw)....。所以我们可以提一个形状类(Graphics)类出来。所有图形就去继承它。
代码如下:
/// <summary> /// 画笔抽象类 /// </summary> public abstract class Graphics { public abstract void Draw(); } /// <summary> /// 正方形 /// </summary> public class Square : Graphics { public override void Draw() { Console.WriteLine(@"画正方形"); } } /// <summary> /// 长方形 /// </summary> public class Rectangle : Graphics { public override void Draw() { Console.WriteLine(@"画长方形"); } } /// <summary> /// 圆 /// </summary> public class Circle : Graphics { public override void Draw() { Console.WriteLine(@"画圆形"); } }
因为形状这个东西指的范围太广了(也就是一个抽象的东西(比如:三角形,四角形,正五边形也是形状))所以就用一个abstract来修饰Graphics类
上面我讲过多态三要素:继承,实现,父类引用指向子类(向上类型转换Upcast)。上面的代码已经完成前二步了(第一继承,第二实现),接下来我们完成第三步就实现了多态
static void Main(string[] args) { Graphics p1 = new Square(); Graphics p2 = new Rectangle(); Graphics p3 = new Circle(); Graphics[] paints = { p1, p2, p3 }; Draw(paints); } public static void Draw(Graphics[] paints) { foreach (Graphics p in paints) { p.Draw(); } } /// <summary> /// 画笔抽象类 /// </summary> public abstract class Graphics { public abstract void Draw(); } /// <summary> /// 正方形 /// </summary> public class Square : Graphics { public override void Draw() { Console.WriteLine(@"画正方形"); } } /// <summary> /// 长方形 /// </summary> public class Rectangle : Graphics { public override void Draw() { Console.WriteLine(@"画长方形"); } } /// <summary> /// 圆 /// </summary> public class Circle : Graphics { public override void Draw() { Console.WriteLine(@"画圆形"); } }
分析图
上面就是一个多态简单的Demo了。
总结:
1.多态三要素:继承,实现,父类引用指向子类
2.如果你的项目没有前期的需求分析的,一般会很少用到多态。多态一般在软件设计上面用得比较多。
3.面向对象编程(OOP)三大特性:继承,封装,多态。
(PS:文章如有误,愿见谅。希望能指出来,以免误人子弟了。^_^)