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();
   }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM