zoukankan      html  css  js  c++  java
  • 用例子来彻底搞明白Virtual 和 非 virtual(C#)

      virtual出问题主要是由于声明对象的类和对象实际所属的类不是一个类,一般都是父类和子类的关系。比如:
      ClassParent obj = new ClassSub(),这是根源。
      virtual和非virtual关键是在运行时候,而不是在编译时候。
      1, 如果方法不是virtual的,编译器就使用声明的类对应的类型,也就是说,不是virtual的,在编译时候,就定了。比如下面的例子:子类的方法都没有执行,执行的全部都是父类的方法。运行的结果是
    father
    boy
    girl

    using System;
    public class ClassFather
    {
        public string s1;
        // virtual public void VirFun()
        public void VirFun()
        { Console.WriteLine(s1); }
    }

    public class ClassBoy : ClassFather
    {
        public new void VirFun()
        { base.VirFun(); }
    }

    public class ClassGirl : ClassFather
    {
        public new void VirFun()
        {
            base.VirFun();
            Console.WriteLine(s1);
        }
    }

    public class Test
    {
        public static void Main()
        {
            ClassFather a = new ClassFather();
            a.s1 = "father";
            a.VirFun();

            ClassFather b = new ClassBoy();
            b.s1 = "boy";
            b.VirFun();

            ClassFather c = new ClassGirl();
            c.s1 = "girl";
            c.VirFun();
        }
    }
    2, 如果方法是Virtual的,然后子类使用了override, 编译器就生产代码。然后,在运行的时候,进行检测,看对象属于哪个类,然后调用这个类的方法。 这个是最常用的方法,基本上所有书上说的就是这个,我就不多此一举了。

    3,如果一个父类的方法是virtual,子类不是用override,而是用new来覆盖了,那么运行子类的时候,还是执行声明的类的方法。比如下面的例子中,girl类对象就是。

    using System;
    public class ClassFather
    {
        public string s1;
        virtual public void VirFun()
        { Console.WriteLine(s1); }
    }

    public class ClassBoy : ClassFather
    {
        public override void VirFun()
        { base.VirFun(); }
    }

    public class ClassGirl : ClassFather
    {
        public new void VirFun()
        {
            base.VirFun();
            Console.WriteLine(s1);
        }
    }

    public class Test
    {
        public static void Main()
        {
            ClassFather a = new ClassFather();
            a.s1 = "father";
            a.VirFun();

            ClassFather b = new ClassBoy();
            b.s1 = "boy";
            b.VirFun();

            ClassFather c = new ClassGirl();
            c.s1 = "girl";
            c.VirFun();
        }
    }

  • 相关阅读:
    快速了解MongoDB
    如何在 Ubuntu 上安装 MongoDB
    Python操作MongoDB文档数据库
    C# Convert.ToDouble 在不同的区域下的问题
    Visual Studio 调试C#程序时,提示“无法加载程序集****.XmlSerializers.dll",文件找不到 的问题
    C# 调用打印机打印文件
    C# 获取所有可用的打印机
    记录一次排查使用HttpWebRequest发送请求的发生“基础连接已关闭:接收时发生错误”异常问题的过程
    SQL 分组后只获取每组的一条数据
    记录一次使用NPOI遇到的问题
  • 原文地址:https://www.cnblogs.com/chuncn/p/1389517.html
Copyright © 2011-2022 走看看