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");
}
}
}
ASP.NET之虚方法的更多相关文章
- asp.net 抽象方法和虚方法的用法区别,用Global类重写Application_BeginRequest等方法为例子
不废话,直接贴代码 public abstract class LogNetGlobal : System.Web.HttpApplication { protected void Applicati ...
- C# 工厂模式+虚方法(接口、抽象方法)实现多态
面向对象语言的三大特征之一就是多态,听起来多态比较抽象,简而言之就是同一行为针对不同对象得到不同的结果,同一对象,在不同的环境下得到不同的状态. 实例说明: 业务需求:实现一个打开文件的控制台程序的d ...
- 重写ValidateEntity虚方法实现可控的上下文验证和自定义验证
上篇文章介绍了ValidationAttribute和IValidatableObject.Validate验证,但是这种验证还是稍微简单了,对于复杂的实体,例如:继承过来的实体.实现某接口的实体等等 ...
- Delphi之静态方法,虚方法virtual,动态dynamic,抽象abstract,消息
Delphi之静态方法,虚方法virtual,动态dynamic,抽象abstract,消息 http://www.cnblogs.com/zhwx/archive/2012/08/28/266055 ...
- 《转》 浅谈C# 多态的魅力(虚方法,抽象,接口实现)
前言:我们都知道面向对象的三大特性:封装,继承,多态.封装和继承对于初学者而言比较好理解,但要理解多态,尤其是深入理解,初学者往往存在有很多困惑,为什么这样就可以?有时候感觉很不可思议,由此,面向对象 ...
- C#属性-索引器-里氏替换-多态-虚方法-抽象-接口-泛型-
1.属性 //属性的2种写法 public class person { private string _name; public string Name { get { return _name; ...
- 为何JAVA虚函数(虚方法)会造成父类可以"访问"子类的假象?
首先,来看一个简单的JAVA类,Base. 1 public class Base { 2 String str = "Base string"; 3 protected vo ...
- C++虚方法(虚函数)随笔
本文不讨论虚函数的原理,只简单总结下虚函数的常用事项. 虚函数(虚方法)是C++动态联编 实现多态的重要手段,在函数声明时使用关键字virtual即可,如: virtual void func(voi ...
- 【jq】c#零基础学习之路(3)继承和虚方法
c#只能继承一个基类和多个接口(0+) 父类:Human: class Human { public virtual Move() { Console.WriteLine("Human的虚方 ...
随机推荐
- Android自定义控件之日历控件
标签: android 控件 日历 应用 需求 2015年09月26日 22:21:54 25062人阅读 评论(109) 收藏 举报 分类: Android自定义控件系列(7) 版权声明:转载注 ...
- 类的命名空间&组合
类的命名空间◆类中的静态变量可以被类调用也可以被对象调用◆对不可变数据类型来说,类变量最好用类名操作 class Person: money = 0 mother = Person() father ...
- matlab2014a 转化c语言
一.原因错误 第一种,命令窗口测试代码mbulid -setup 出错 , 就是电脑没有安装sdk7.1 网上有很多安装教程(注意要有vc++2010要卸载,具体看网上教程,安装好了要更性vc++ ...
- mysql distinct()用法
在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供有distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记录的条数,而不是用它来返回不重记录的所 ...
- [Unity][安卓]Unity和Android Studio 3.0 交互通讯(1)Android Studio 3.0 设置
[安卓]Android Studio 3.0 JDK安卓环境配置(2017.10) http://blog.csdn.net/bulademian/article/details/78387052 [ ...
- MySQL使用root权限创建用户并授权
MySql篇 1.下载并安装Mysql (1)下载地址 MySQL-8.0下载地址 (2)Mysql配置 1.home目录下命令行执行:vi .bash_profile来配置MySql绝对路径 ...
- C#基础加强(7)之ref与out
介绍 给方法传递普通参数时,值类型传递的是拷贝的对象,而引用类型传递的是对象的引用.它们都不能在函数内部直接修改外部变量的引用(不是修改引用类型的属性),而使用 ref 或 out 关键字就可以实现. ...
- webpack(7)-生产环境
development(开发环境) 和 production(生产环境) 这两个环境下的构建目标存在着巨大差异.在开发环境中,我们需要:强大的 source map 和一个有着 live reload ...
- CentOS7安装vsftpd3.0.2、以及虚拟用户配置
vsftpd(very secure ftp daemon)是一款运行在Linux操作系统上的FTP服务程序,不仅完全开源而且免费,还具有很高的安全性.传输速度,以及支持虚拟用户验证. vsftpd ...
- tp5命令行
手册->命令行->自定义命令行 1.第一步,配置command.php文件 2.第二步,建立命令类文件 注意:该文件中代码,从文档中粘,以防写错. 名字啥的都不用改,就改命名空间 和 定义 ...