小例证大智慧2-C#中的多态Polymorphism
以上篇的实体类型为引子,我就直接贴过来了:
Person实例类型:
public class Person
{
public string Name;
public string Sex;
public int Age;
//构造函数,初始化
public Person()
{
this.Name = "张三";
this.Sex = "男";
this.Age = 30;
}
public string SayHi()
{
return "Hell!How are you?";
}
//virtual修饰符进行修饰来启用多态
public virtual string Hello()
{
return "Hell!How are you?";
}
}
加了一个Hello方法,并且看到有个字符去修饰,目的就是为了实现重写
Student实例类型:
public class Student : Person
{
public int CJ;
//构造函数,初始化
public Student()
{
this.CJ = 90;
}
public string SayHi()//使用new有意隐藏基类方法
{
return "你好啊!....";
}
public override string Hello()//重写
{
return "你好啊!....";
}
}
override重写hello方法,实现多态
页面aspx页面的设计
<body>
<form id="form1" runat="server">
<div>
不用重写多态:<br />
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label><br />
<asp:Label ID="Label2" runat="server" Text="Label"></asp:Label><br />
重写多态:<br />
<asp:Label ID="Label3" runat="server" Text="Label"></asp:Label><br />
<asp:Label ID="Label4" runat="server" Text="Label"></asp:Label>
</div>
</form>
</body>
后台.cs文件中代码
protected void Page_Load(object sender, EventArgs e)
{
//不用重写多态
Person[] p = new Person[2];
p[0] = new Person();
p[1] = new Student();
foreach (var l in p)
{
if (l is Student)
{
Student s = l as Student;
Label1.Text = s.SayHi();
}
else if (l is Person)
{
Person t = l as Person;
Label2.Text = t.SayHi();
}
}
//重写多态
Person[] persons = new Person[2];
persons[0] = new Person();
persons[1] = new Student();
int index = 0;
foreach (var z in persons)
{
++index;
if (index == 1)
{
Label3.Text = z.Hello();
}
else
{
Label4.Text = z.Hello();
}
}
}
如果不用重写实现多态的话,第一种方法如果加一个实例类怎么办?
第二种能很好的体现出来,不用区分。
页面显示结果:
不用重写多态:
你好啊!....
Hell!How are you?
重写多态:
Hell!How are you?
你好啊!....