体验多态之美(转)
早在看《大话设计模式》第一章的时候,就对诸如Animal = New Cat ()这种用父类来引用之类的多态用法就不是很懂了,当初习惯的思维是Animal就一定要实例化一个Animal类,对于接口也同样!
现在写到《大话设计模式》后面面向对象基础的时候,才算是把这个问题搞懂了。
看来,要学好C#,首先应该打好面向对象的基础。上面说到的“面向对象基础”就是一个很好的入门!
不多说了,先看看多态的例子吧:
下面是Animal类:
用到多态的时候,要注意:子类以父类的身份出现;在工作时候以自己的方式实现;子类以父类的身份出现时候,子类特有的方法和属性不可以使用。
同时,为了使子类的实例完全接替来自父类的类成员,父类应该将该成员声明为虚拟。而子类通过Virtual关键字来实现父类的虚拟方法。
本文的大部分内容均来自《大话设计模式》,谢谢程老师提供了这么好的学习资料!
using System;
using System.Collections.Generic;
using System.Text;
namespace 面向对象基础
{
public class Animal
{
protected string name = "";
public Animal(string name)
{
this.name = name;
}
public Animal()
{
this.name = "无名";
}
protected int shoutNum = 3;
public int ShoutNum
{
get { return shoutNum; }
set { shoutNum = value; }
}
//添加虚方法,可以被子类重写
public virtual string Shout()
{
return "";
}
}
public 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;
}
}
public class Dog : Animal
{
public Dog()
: base()
{ }
public Dog(string name)
: base(name)
{ }
//重写虚方法
public override string Shout()
{
string result = "";
for (int i = 0; i < shoutNum; i++)
{
result +="汪";
}
return "我的名字叫" + name + " " + result;
}
}
}
客户代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace 面向对象基础
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Cat cat = new Cat("咪咪");
cat.ShoutNum = 5;
MessageBox.Show(cat.Shout());
}
private void button2_Click(object sender, EventArgs e)
{
Dog dog = new Dog("豆豆");
dog.ShoutNum = 5;
MessageBox.Show(dog.Shout());
}
private Animal[] arraryAnimal; // 声明一个动物数组
//动物报名
private void button3_Click(object sender, EventArgs e)
{
arraryAnimal = new Animal[5]; //实例化最多可以5个动物参赛
arraryAnimal[0] = new Cat("小花");
arraryAnimal[1] = new Cat("阿猫");
arraryAnimal[2] = new Dog("阿旺");
arraryAnimal[3] = new Dog("小强");
arraryAnimal[4] = new Dog("旺才");
}
//动物叫声比赛
private void button4_Click(object sender, EventArgs e)
{
foreach (Animal aniItem in arraryAnimal) //历遍数组
{
// 由于多了多态,所以在叫声的时候,程序会自动找aniItem是什么对象,然后重写这个方法
MessageBox.Show(aniItem.Shout());
}
}
}
}
客户窗体:

Cat和Dog都继承自Animal,但是它们的叫声均不相同,这就是所谓的“不同对象执行相同的动作,但要通过子类自己的代码来实现”。
在使用多态的时候要注意,对象的声明必须是父类,而不是子类,实例化对象是子类,这才实现多态。多态的原理相当于当方法被调用时,无论对象是否被转换为其父类,都只有位于对象继承链最末端的方法实现被调用。也就是说,虚方法是按照其运行时而不是编译时类型进行动态绑定调用的。
多态是面向对象的三大特征之一。它表示不同的对象可以执行相同的动作,但是要通过自己的代码实现。



浙公网安备 33010602011771号