zoukankan      html  css  js  c++  java
  • ASP.NET之虚方法

    1.虚方法关键字?

       Virtual

    2.虚方法运行的周期?

          虚函数在编译期间是不被静态编译的,它的相对地址是不确定的,它会根据运行时对象实例来动态判断要调用的函数,其中那个申明时定义的类叫申明类,执行实例化的那个类叫做实例类。

    3.函数运行的检查流程:

          1当调用一个对象的函数时,系统会直接去检查这个对象的申明定义的类(申明类),检查调用的函数是否为虚函数,如果不是虚函数,那么它就执行该函数。而如果有Viirtual关键字(虚函数),那么它

    就不会立即执行该函数。而是转去检查对象的实例类。在这个实例类里,它会检查这个实例类中是否有重现实现该函数(Override),如果有就不再找了,马上执行该实例类中的这个重新实现的函数

    而如果每天有,系统就会不停的往上找实例类,直到找到第一个重载了该函数的父类为止,然后执行父类里重载后的的函数

    另注意:虚函数里必须有方法体。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ConsoleHelp
    {
      public  class RunVirtual
        {
    
          /// <summary>
          /// 虚方法说明以及代码
          /// </summary>
          public void TestRunVirtual() {
    
              //注意:虚方法不允许static, abstract, 或override 修饰符
    
              TestA A;// 定义一个a这个A类的对象.这个A就是a的申明类
              TestA B;// 定义一个b这个A类的对象.这个A就是b的申明类
              TestA C;// 定义一个c这个A类的对象.这个A就是b的申明类
              TestA D;// 定义一个d这个A类的对象.这个A就是b的申明类
    
              A = new TestA();// 实例化a对象,A是a的实例类
              B = new TestB();// 实例化b对象,B是b的实例类
              C = new TestC();// 实例化b对象,C是b的实例类
              D = new TestD();// 实例化b对象,D是b的实例类
    
    
              A.Fuctio();//先检查声明类A,发现是虚函数,跳出检查实例类即为本身,执行A的Fuctio方法
              B.Fuctio();//先检查声明类A,发现是虚函数,跳出检查实例类,实例类B中有重写,执行重写方法Fuctio
              C.Fuctio();//先检查声明类A,发现是虚函数,跳出检查实例类,实例类C中没有重写,找父类B(继承了B类),执行B类中重写方法Fuctio
              D.Fuctio();//先检查声明类A,发现是虚函数,跳出检查实例类,实例类D中虽然有声明了Fuctio方法,但并没有重写Fuction,找父类A,发现为本身,执行A类的Fuctio
          
          }
        }
    }

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ConsoleHelp
    {
      public  class TestA
        {
    
          public virtual void Fuctio() {
    
              Console.Write("Fuction in A");
          }  
    
        
        }
    
      public  class TestB:TestA {
    
          public override void Fuctio()
          {
              Console.Write("Fuction in B");
          }
      }
    
    
      public class TestC : TestB {
    
      }
    
    
      public class TestD : TestA {
    
          public void Fuctio() {
    
              Console.Write("Fuction in D");
          }
      }
    }
    
    
    
     
  • 相关阅读:
    学习资料
    InstallShield常用工具
    InstallShield中调用API
    系统目录
    abort和exit
    Uninstall Registry Key
    GDI+资料
    VBScript是什么?有什么优缺点?
    DrawImage调查
    KEIL MDK环境下uCOSII在LPC17xx上的移植实例 Chung
  • 原文地址:https://www.cnblogs.com/JohnTang/p/10325894.html
Copyright © 2011-2022 走看看