- 在类的继承中,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();
}
}