- 在類的繼承中,C#允許在基類與派生類中聲明具有同名的方法,而且同名的方法可以有不同的代碼,
也就是說在基類與派生類的相同功能中可以有不同的實現方法,從而為解決同一問題提供多種途徑。
- 多態性就是指在程序運行時,執行的雖然是一個調用方法的語句,卻可以根據派生類對象的類型的不同完成方法不同的具體實現。
-
在C#中可以通過多種途徑實現多態性:
-
虛方法:將父類的方法標記為虛方法,使用關鍵字virtual,此方法在子類中可以重寫(使用關鍵字override)
-
抽象類與抽象方法:如果我們不需要使用父類創建對象,它的存在只是為供子類繼承。可以將父類寫成抽象(關鍵字abstract)類,將父類的方法寫成抽象方法,子類中的方法仍用關鍵字override重寫。
- 接口實現:
-
我們選擇使用虛方法實現多態還是抽象方類抽象方法實現多態,取決於我們是否需要使用基類實例化的對象。
-
抽象類:不需要使用基類實例化的對象
-
虛方法:需要使用基類實例化的對象
-
舉例:
- 現有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();
}
}