1、什么是多态
   面向对象程序设计中的另外一个重要概念是多态性。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。可以把一组对象放到一个数组中,然后调用它们的方法,在这种场合下,多态性作用就体现出来了,这些对象不必是相同类型的对象。当然,如果它们都继承自某个类,你可以把这些派生类,都放到一个数组中。如果这些对象都有同名方法,就可以调用每个对象的同名方法。
同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性。多态性通过派生类重载基类中的虚函数型方法来实现。在面向对象的系统中,多态性是一个非常重要的概念,它允许客户对一个对象进行操作,由对象来完成一系列的动作,具体实现哪个动作、如何实现由系统负责解释。

2、实现多态
   多态性是类为方法(这些方法以相同的名称调用)提供不同实现方式的能力。多态性允许对类的某个方法进行调用而无需考虑该方法所提供的特定实现。
   可以用不同的方式实现组件中的多态性:
   ● 接口多态性。
   ● 继承多态性。
   ● 通过抽象类实现的多态性。
   
示例:实现多态性的程序

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
    public class DrawingBase
{
        public virtual void Draw()
{
            Console.WriteLine("I'm just a generic drawing object.");
}
}
    public class Line : DrawingBase
{
        public override void Draw()
{
            Console.WriteLine("I'm a Line.");
}
}
 
    public class Circle : DrawingBase
{
        public override void Draw()
{
            Console.WriteLine("I'm a Circle.");
}
}
    public class Square : DrawingBase
{
        public override void Draw()
{
            Console.WriteLine("I'm a Square.");
}
}
    public class DrawDemo
{
        public static int Main(string[] args)
{
            DrawingBase[] dObj = new DrawingBase[4];
            dObj[0] = new Line();
            dObj[1] = new Circle();
            dObj[2] = new Square();
            dObj[3] = new DrawingBase();
            foreach (DrawingBase drawObj in dObj)
drawObj.Draw();
            Console.ReadLine();
            return 0;
}
}
}

输出结果是:

I'm a Line.

I'm a Circle.

I'm a Square.

I'm just a generic drawing object.


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


参考:

http://blog.csdn.net/hliq5399/article/details/6305335