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:文章如有误,愿见谅。希望能指出来,以免误人子弟了。^_^)

 

posted @ 2015-07-05 15:28  qq6105406222  阅读(285)  评论(0编辑  收藏  举报