多态
多态是面向对象的重要特征,多态表示不同的对象可以执行相同的动作,但是要通过他们自己的实现代码来执行。
使用时注意以下几点:
- 子类以父类的身份出现
- 子类在工作时以自己的方式来实现
- 子类以父类的身份出现时,子类特有的属性和方法不可以使用
代码实现
下面使用设计模式书中的例子说明多态。
将猫和狗两个类的实例赋给Animal这个抽象类,当我们调用Shout方法时,实际执行的是猫和狗两个类的方法。
//声明一个动物数组
private Animal[] arrayAnimal;
//动物报名的按钮事件
private void button3_Click(object sender,EventArgs e)
{
//实例化报名的5个动物数组对象
arrayAnimal=new Animal[5];
arrayAnimal=new Cat("小花");
arrayAnimal=new Cat("娇娇");
arrayAnimal=new Dog("小黑");
arrayAnimal=new Dog("阿毛");
arrayAnimal=new Cat("大黄");
}
//叫声比赛的按钮事件
pravite void button4_Click(object sender,EventArgs e)
{
//遍历数组,让它们都shout
foreach (Animal item in arrayAnimal)
{
//多态性的实现
MessageBox.Show(item.Shout());
}
多态性实现的基础是对父类虚方法和子类重写方法的使用。代码如下:
class Animal
{
...
//虚方法
public virtual string Shout()
{
return"";
}
}
class Cat:Animal
{
...
public override string Shout()
{
string result="";
for (int i=0;i<shoutNum;i++)
result+="喵";
return"我的名字叫"+name+""+result;
}
}
class Dog:Animal
{
...
public override string Shout()
{
string result="";
for (int i=0;i<shoutNum;i++)
result+="汪";
return"我的名字叫"+name+""+result;
}
}
如果没有多态的话,参加报名的动物要实现shout方法,就要每个实例都写一行代码,或者根据不同的类再分组实现。
因为猫和狗属于两个不同的类,没有办法将它们放在一个数组中统一使用方法Shout
private void button3_Click(object sender,EventArgs e)
{
Cat a =new Cat("小花");
Cat b =new Cat("娇娇");
Dog c =new Dog("小黑");
Dog d =new Dogt("阿毛");
Cat e =new Cat("大黄");
}
pravite void button4_Click(object sender,EventArgs e)
{
a.Shout();
b.Shout();
c.Shout();
d.Shout();
e.Shout();
}
实质
面向对象中多态的实质是说空话,做实事。意思就是,抽象类实际上是说空话的载体,而真正做实际事情的是具体的实现类。