C#多态之虚方法
1.多态
多态:让一个对象能够表现出多种的状态(类型)。实现多态的三种方法:1.虚方法2.抽象类 3.接口。
2.代码
下面这个例子是未使用多态的代码,调用SayHello()的方法需要使用到里氏转换,代码比较冗长。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 多态
{
internal class Program
{
static void Main(string[] args)
{
Chinese c1 = new Chinese("张三");
Chinese c2 = new Chinese("李四");
Japanese j1 = new Japanese("村井英子");
Americans a1 = new Americans("lisa");
Americans a2 = new Americans("jane");
Person person = new Person("人");
Person[] per = { c1, c2, j1, a1, a2, person };
for (int i = 0; i < per.Length; i++)
{
// per[i].SayHello();//如果是这种写法,表现的是父类类型,调用的是父类函数
//如果要看到子类各种打招呼的方式可以强转
#region 这种方法太冗长
if (per[i] is Chinese)
{
((Chinese)per[i]).SayHello();
}
else if (per[i] is Japanese)
{
((Japanese)per[i]).SayHello();
}
else if (per[i] is Americans)
{
((Americans)per[i]).SayHello();
}
else
{
per[i].SayHello();
}
#endregion
//per[i].SayHello();
}
Console.ReadKey();
}
}
public class Person
{
private string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
public Person(string name)
{
this._name = name;
}
public void SayHello()
{
Console.WriteLine("我是人类");
}
}
public class Chinese : Person
{
public Chinese(string name) : base(name)
{
}
public void SayHello()
{
Console.WriteLine("我是中国人,我叫{0}", this.Name);
}
}
public class Japanese : Person
{
public Japanese(string name) : base(name)
{
}
public void SayHello()
{
Console.WriteLine("我是日本人,我叫{0}", this.Name);
}
}
public class Americans : Person
{
public Americans(string name) : base(name)
{
}
public void SayHello()
{
Console.WriteLine("我是美国人,我叫{0}", this.Name);
}
}
}
下面这个例子是使用虚方法的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 多态
{
internal class Program
{
static void Main(string[] args)
{
//多态:让一个对象能够表现出多种的状态(类型)
//实现多态的三种方法:1.虚方法2.抽象类 3.接口
Chinese c1 = new Chinese("张三");
Chinese c2 = new Chinese("李四");
Japanese j1 = new Japanese("村井英子");
Americans a1 = new Americans("lisa");
Americans a2 = new Americans("jane");
Person person = new Person("人");
Person[] per = { c1,c2,j1,a1,a2,person};
for (int i = 0; i < per.Length; i++)
{
per[i].SayHello();
}
Console.ReadKey();
}
}
public class Person
{
private string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
public Person(string name)
{
this._name = name;
}
public virtual void SayHello()
{
Console.WriteLine("我是人类");
}
}
public class Chinese : Person
{
public Chinese(string name):base(name)
{
}
public override void SayHello()
{
Console.WriteLine("我是中国人,我叫{0}",this .Name);
}
}
public class Japanese : Person
{
public Japanese(string name) : base(name)
{
}
public override void SayHello()
{
Console.WriteLine("我是日本人,我叫{0}", this.Name);
}
}
public class Americans : Person
{
public Americans(string name) : base(name)
{
}
public override void SayHello()
{
Console.WriteLine("我是美国人,我叫{0}", this.Name);
}
}
}
3.总结
实现虚方法的步骤: /将父类的方法标记为虚方法,使用关键字virtual,这个函数可以被子类重写,子类的方法需要使用关键字override。优点:减少很多代码。
4.小练习
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 练习
{
internal class Program
{
static void Main(string[] args)
{
Dark dark = new Dark();
MuDark muDark = new MuDark();
XjDark xjDark = new XjDark();
Dark[] darks = { dark, muDark, xjDark };
for (int i = 0; i < darks.Length; i++)
{
darks[i].Bark();
}
Console.ReadKey();
}
}
public class Dark
{
public virtual void Bark()
{
Console.WriteLine("真的鸭子嘎嘎叫");
}
}
public class MuDark : Dark
{
public override void Bark()
{
Console.WriteLine("木偶鸭子嘎嘎叫");
}
}
public class XjDark : Dark
{
public override void Bark()
{
Console.WriteLine("橡胶鸭子嘎嘎叫");
}
}
}