class Program
{
static void Main(string[] args)
{
//开放封闭原则:对扩展开放,对修改关闭原则
Chinese ch = new Chinese("张三");
Japanese ja = new Japanese("松下井田");
American am = new American("Tom");
//由于多个子类对象,那么声明一个父类的对象就能将子类的
//对象一一放进来存放。
Person[] per = new Person[] { ch, ja, am };
//if (per is Chinese)
//{
// Chinese c = (Chinese)per;
// c.Say();
//}
//else if (per is Japanese)
//{
// Japanese j = (Japanese)per;
// j.Say();
//}
//else
//{
// American a = (American)per;
// a.Say();
//}
#endregion
//这样就只要一句话的代码就能搞定
//这就体现了多态
per.Say();
}
Console.WriteLine();
Console.ReadKey();
}
}
class Japanese:Person
{
public Japanese(string name)
: base(name)
{
}
public override void Say()
{
Console.WriteLine("我叫{0},我是日本人!", Name);
}
}
class Chinese : Person
{
public Chinese(string name):base(name)
{
this.Name = name;
}
//如果子类要重写父类的方法,那么要在子类方法名前 加一个override关键字,如下
//并且有且仅有这个一个关键字重写父类的方法
public override void Say()
{
Console.WriteLine("我叫{0},我是中国人!",Name);
}
}
class American : Person
{
public American(string name):base(name)
{
this.Name = name;
}
public override void Say()
{
Console.WriteLine("我叫{0},我是美国人!", Name);
}
}
public class Person
{
public Person(string name)
{
this.Name = name;
}
public string Name
{
get;
set;
}
//virtual关键字是标记为虚方法用的
//如果一个方法是虚方法,那么这个方法在子类中就可以被重写了
//子类继承父类后,可以直接使用父类的方法,也可以将它重写 (用关键字override即可)
public virtual void Say()
{
Console.WriteLine("父类中的Say方法");
}
}