在介绍完前面那两个面向对象的两个特性之后,接下来就是最后一个特性:多态。
定义:多态表示不同的对象可以执行相同的动作,但要通过它们自己的实现代码来执行。
例子:在国粹“京剧”中,很多都是师傅带徒弟,是代代相传的艺术。假设师傅是一个非常著名的京剧艺术家,徒弟也很厉害,模仿师傅的戏十分的惟妙惟肖。有一天,师傅突然发生了事故,无法上台,而票早就卖出,退票显然会影响声誉。怎么办呢?由于京剧的戏都是需要化妆才可以上台的,于是就决定让徒弟代替师傅上台。
注意:
1.子类【徒弟】以父类【师傅】的身份出现,也就是徒弟以师傅的身份登台演出。
2.子类【徒弟】在工作时以自己的方式来实现,这说明徒弟模仿的再好,那也是模仿,徒弟只是以自己的理解去表现师傅的作品。
3.子类【徒弟】以父类【师傅】的身份出现时,子类【徒弟】特有的属性和方法不可以使用,也就是说徒弟在经过多年的学习后,也有了自己的绝活和成名绝技,但是在此时,代替师傅上场表演的时候,是不可以表现出来的。
概念:
1.虚方法:为了使子类的实例完全接替来自父类的类成员,父类必须将该成员声明为虚拟的这是通过在该成员的返回类型之前添加virtual关键字来实现。(通常虚拟的是方法,但其实是除了字段不能是虚拟的,属性、事件和索引器都可以是虚拟的。)
2.方法重写:子类可以选择使用override关键字,将父类实现替换为它自己的实现,这就是方法重写override,或者叫做方法覆写。
代码:
class Animal
{
......
public virtual string Shout()
{
return"";
}
}
class Cat:Animal
{
public Cat():base()
{}
public Cat(string name):base(name)
{}
public override string Shout()
{
string result="";
for(int i=0;i<shoutNum;i++)
{
result+="喵,";
}
return "我的名字叫"+name+""+result;
}
}
客户端代码:
private Animal[] arrayAnimal;
//"动物报名"的按钮事件
private void button3_Click(object sender,EventArgs e)
{
arrayAnimal=new Animal[2];
arrayAnimal[0]=new Cat("小花");
arrayAnimal[1]=new Cat("小白");
}
//"叫声比赛"的按钮事件
private void button4_Click(object sender, EventArgs e)
{
foreach (Animal item in arrayAnimal)
{
MessageBox.Show(item.Shout());
}
}