using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication1
{
/*1、如果方法不是virtual的,编译器就使用声明的类对应的类型,也就是说,不是virtual的,在编译时候,就定了。比如下面的例子:子类的方法都没有执行,执行的全部都是父类的方法。
2、如果方法是Virtual的,然后子类使用了override, 编译器就生产代码。然后,在运行的时候,进行检测,看对象属于哪个类,然后调用这个类的方法。 */
#region 非virtual
public class ClassFather
{
public string FatherName;
// virtual public void VirFun()
public void VirFun()
{ Console.WriteLine(FatherName); }
}
public class ClassBoy : ClassFather
{
public string BoyName;
public new void VirFun()
{ base.VirFun(); }
}
public class ClassGirl : ClassFather
{
public string GirlName;
public new void VirFun()
{
base.VirFun();
Console.WriteLine(FatherName);
}
}
#endregion
#region virtual
public class ClassFather1
{
public ClassFather1()
{
FatherName = "FatherName";
FatherName1 = "FatherName1";
Console.WriteLine("ClassFather1 构造函数输出:FatherName=" + FatherName + ",FatherName1=" + FatherName1);
}
public string FatherName;
public string FatherName1;
// virtual public void VirFun()
public virtual void VirFun()
{ Console.WriteLine(FatherName); }
public virtual void VirFun1()
{
Console.WriteLine("ClassFather1的VirFun1的输出");
}
public void VirFun2()
{
Console.WriteLine("ClassFather1的VirFun2的输出");
}
}
public class ClassBoy1 : ClassFather1
{
public ClassBoy1()
{
Console.WriteLine("ClassBoy1 构造函数输出:FatherName=" + FatherName + ",FatherName1=" + FatherName1);
}
public string BoyName;
public new void VirFun()
{ Console.WriteLine("ClassBoy1 VirFun输出"); }
public override void VirFun1()
{
Console.WriteLine("ClassBoy1 VirFun1输出");
}
}
public class ClassGirl1 : ClassFather1
{
public string GirlName;
public ClassGirl1()
{
Console.WriteLine("ClassGirl1 构造函数输出:FatherName=" + FatherName + ",FatherName1=" + FatherName1);
}
public new void VirFun()
{
Console.WriteLine("ClassGirl1 VirFun输出");
}
public override void VirFun1()
{
Console.WriteLine("ClassGirl1 VirFun1输出");
}
public void VirFun2()
{
Console.WriteLine("ClassGirl1 VirFun2输出");
}
public void VirFun3()
{
Console.WriteLine("ClassGirl1 VirFun3输出");
}
}
#endregion
public class Test
{
public static void Main()
{
ClassFather1 a1 = new ClassFather1();
a1.FatherName = "father";
a1.VirFun();
ClassFather1 b1 = new ClassBoy1();
b1.FatherName = "boy";
b1.VirFun();
b1.VirFun1();
b1.VirFun2();
ClassFather1 c1 = new ClassGirl1();
c1.FatherName = "girl";
c1.VirFun();
c1.VirFun1();
c1.VirFun2();
ClassGirl1 c11 = new ClassGirl1();
c11.FatherName = "girl11";
c11.VirFun();
c1.VirFun();
c11.VirFun1();
c1.VirFun1();
c11.VirFun2();
c1.VirFun2();
c11.VirFun3();
}
}
}