欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

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");
      }
  }
}

 

 

 转载于:https://www.cnblogs.com/JohnTang/p/10325894.html


来自  https://blog.csdn.net/dianchanchan1786/article/details/101603895



普通分类: