C#中 类的多态

  • 在类的继承中,C#允许在基类与派生类中声明具有同名的方法,而且同名的方法可以有不同的代码,

    也就是说在基类与派生类的相同功能中可以有不同的实现方法,从而为解决同一问题提供多种途径。

  • 多态性就是指在程序运行时,执行的虽然是一个调用方法的语句,却可以根据派生类对象的类型的不同完成方法不同的具体实现
  • 在C#中可以通过多种途径实现多态性:

  1. 虚方法:将父类的方法标记为虚方法,使用关键字virtual,此方法在子类中可以重写(使用关键字override)

  2. 抽象类与抽象方法:如果我们不需要使用父类创建对象,它的存在只是为供子类继承。可以将父类写成抽象(关键字abstract)类,将父类的方法写成抽象方法,子类中的方法仍用关键字override重写。

  3. 接口实现:
  • 我们选择使用虚方法实现多态还是抽象方类抽象方法实现多态,取决于我们是否需要使用基类实例化的对象。

  • 抽象类:不需要使用基类实例化的对象

  • 虚方法:需要使用基类实例化的对象

  • 举例:

  1. 现有Clerk(基类),ProjectManager(继承类),此时需要使用虚方法来实现多态,因为我们需要使用Clerk创建的对象,这些对象是普通员工对象

    职员(Clerk)需要有工作计划,经理(ProjectManager)也需要有工作计划

   2. 现有Drink类作为基类,Milk,Tea类继承Drink,我们需要使用的是Milk和Tea创建对象,无需Drink创建对象,此时将Drink写成抽象类

    茶(Tea)可以饥渴,牛奶(Milk)也可以解渴————此时抽象出一个饮料(Drink)类作为基类

    

采用虚拟方法代码如下:

 1 class Clerk
 2 {
 3     public virtual void WorkPlan()    // 此处采用virtual方法
 4     {
 5          Console.WriteLine("我是职员,我需要有工作计划");
 6     }
 7 }    
 8 class ProjectManager:Clerk  // 继承于Clerk
 9  {
10         public override void WorkPlan()  // 用override进行重写
11         {
12             Console.WriteLine("我是经理,我也需要有工作计划");
13         }
14  }
15         
16 
17 class Program              
18 {
19       static void Main(string[] args)
20       {
21           Clerk myClerk = new Clerk();
22           ProjectManager myPM = new ProjectManager();
23           Clerk[] clerk = { myClerk, myPM };
24           foreach (Clerk outclerk in clerk)
25               outclerk.WorkPlan();
26           Console.ReadKey();     
27       }
28 }           

 采用抽象方法代码如下:

abstract class Drink
{
    public abstract void drink();   // 使用抽象化方法时,不能有方法体
}

class Milk:Drink
{
    public override void drink()
    {
        Console.WriteLine("我是牛奶,我可以解渴");
    }
}

class Tea:Drink
{
    public override void drink()
    {
        Console.WriteLine("我是茶,我可以解渴");
    }
}

 class Program
 {
    static void Main(string[] args)
    {

    Drink myMilk = new Milk();  // 此处注意抽象类Drink是不能进行实例化的
    Drink myTea = new Tea();
    Drink[] drink = { myMilk, myTea };
    foreach (Drink outDrink in drink)
        outDrink.drink();
    Console.ReadKey();
   }
}
原文地址:https://www.cnblogs.com/lihq-sharefield/p/6822226.html