关于 类的 virtual 实例 说明 (c#)

来源:互联网 发布:java是开源的吗 编辑:程序博客网 时间:2024/05/29 03:20

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();

        }

    }
}