// 类的多态
// 多态就是指在程序运行时,执行的虽然是一个调用方法的语句,却可以根据派生类对象的类型的不同完成方法不同的具体实现
// 当派生类从基类继承时,它会获得积累的所有方法,字段,属性,和事件.派生类可以选择:
// 1.继承最接近的基类方法而不是重写它
// 2.重写基类中的虚拟成员.
// 3.定义隐藏类实现的成员的新非虚实现
// 实现多态的方法: 1.虚方法 :将父类的方法标记为虚方法,使用关键字virtual,此方法可以在子类中可以重写(重写使用关键字override)
// 2.抽象类和抽象方法:如果我们不需要使用父类创建对象,它的存在只是为了供子类继承.可以将父类写成抽象类(关键字abstract)
// 将父类方法写成抽象方法,子类中的方法仍然用关键字override重写;
// 3. 接口实现;
// 抽象类: 不需要使用基类实例化的对象;
// 虚方法: 需要使用基类实例化的对象;
// 我们选择使用虚方法实现多态还是抽象类抽象方法实现多态,取决于我们是否需要使用基类实例化的对象
Clerk myClerk = new Clerk (); // new 创建一个对象
ProjectManager myPm = new ProjectManager ();
Clerk[] clerk = { myClerk, myPm }; // 用数组调用
foreach (Clerk outclerk in clerk)
outclerk.WorkPlan();
// 错误写法 Drink myMilk = new Drink (); 抽象类是不允许创建实例的
Drink myMilk = new Milk (); // 必须用子类来调用
Drink myTea = new Tea ();
Drink [] drink={myMilk,myTea};
foreach (Drink outdrink in drink)
outdrink.drink();
Console.ReadKey ();
}
}
// 实例1: 职员需要有工作计划,经理也需要有工作计划
// 分析: 现在有一个Cleck类作为父类, ProjectManager 类继承自Cleck, 因为需要父类创建的对象,所以用虚方法来实现多态
// 虚方法:
class Clerk{
public virtual void WorkPlan(){ //声明虚方法
Console.WriteLine ("我是职员,我需要有工作计划");
}
}
class ProjectManager:Clerk{
public override void WorkPlan(){ // 重写基类方法
Console.WriteLine ("我是项目经理,我也需要有工作计划");
}
}
// 实例2: 茶可以解渴,牛奶也可以解渴;
// 分析: 没有基类 所以需要从新声明一个基类 drink;
// tea 和 milk都是属于Drink类, 而我们需要使用milk和tea创建的对象,而根本不需要使用Drink创建的对象,所以可以使用抽象类抽象方法
// 抽象方法:
abstract class Drink{ // 创建一个名为Drink的父类
public abstract void drink();
//利用抽象来实现类抽象化,然后方法抽象化,方法中不能有方法体;
// {
// Console.WriteLine ("我是饮料,可以解渴");
// }
}
class Milk:Drink{ // 创建一个Milk的子类,继承与Drink父类
public override void drink(){ // 重写
Console.WriteLine ("我是牛奶,我可以解渴");
}
}
class Tea:Drink{ // 创建一个Tea的子类,继承与Drink父类
public override void drink(){
Console.WriteLine ("我是茶,我可以解渴");
}
}