—C#继承关系中【方发表】的创建和调用

Insus.NET实现一个最炫最原创的验证码。你可以从下面的一步一步的演译。

实现一个验证码,需要了解的是,它最基本是随机产生字符串:《在ASP.NET MVC应用程序中随机获取一个字符串http://www.cnblogs.com/insus/p/3619224.html

随机的字符串准备好,由于是在MVC应用程序实现,还得了解显示图片:《MVC显示Base64图片http://www.cnblogs.com/insus/p/3621199.html

开始尝试实现《ASP.NET MVC验证码演示http://www.cnblogs.com/insus/p/3622116.html 这篇的验证码,是参考网上的,使用以前asp.NET传统的方式,Generic Handler的ashx来实现。觉得现在是学习MVC,那想不需要ashx了,直接在控制器的Action来实现,因此产生下一篇《ASP.NET MVC验证码演示(Ver2)http://www.cnblogs.com/insus/p/3623546.html

最后这篇实现的验证码,代码是是参考网络上,Insus.NET觉得一定会有雷同,而变得平淡。再尝试改变一下。不要背景色了,直接把随面产生的字符串存储为图片《MVC把随机产生的字符串转换为图片http://www.cnblogs.com/insus/p/3624235.html 测试过程序中,如果这样的验证码放在白色的网页下,觉得没有什么问题,但是放在有颜色的背景网页下,就很显眼了。一个白色框框,内置随机字符串。

是否可以存储为一个没有底色的字符串图片呢?尝试过程中,花上很多时间,但没有实现,不过还是想到,不然直接写到一张图片上去,这样是否好些《ASP.NET MVC应用程序把文字写在图片上http://www.cnblogs.com/insus/p/3626970.html 这样做的话,似乎又回到从前,如果这样话的,实现的验证码背景是一张从不变换的图片。

Insus.NET又想到,是否从一张大图片,随机剪切一块区域用来作验证码背景图片,那如何剪切图片呢?得先实现这个功能,才能谈得上随机剪切。《ASP.NET MVC实现剪切图片http://www.cnblogs.com/insus/p/3627437.html

根据上面曾实现过的函数与方法,不必重写了,在控制器中,创建两个Action:

从网上下载一张图片,图片版权属原作者所有:

下面是GetCaptchaImage():

好吧,创建一个视图:

看看演示:

 
 

前言:

现在正在读《你必须知道的.net》(第二版)一书,看到IL语言那一章,将call、callvirt和calli时候,书中举了一个例子,是一个三层继承的例子,我一开始看的时候就有点懵。

代码如下:

 

代码看似很简单,Grandson继承了Son,Son继承了Father。main()方法中,声明了两个实例,调用实例方法。但是运行的结果却让我懵圈了,结果如下:

费尽周折俩小时想不出,我忽然想起书中一开始将继承的时候,将到了继承关系中方发表的创建,这才弄清楚了这个关系。

本文就以此例子大体讲讲在继承关系中,方发表是如何创建的。

创建方发表:

当一个对象初始化时,比如:Father son = new Son();

系统会找到这个对象的类,将它的实例方法添加到方法表中。但是,如果这个类有父类,则先创建父类的。因为子类可能会override父类的方法。以Father son = new Son(); 为例:

根据以上代码,new一个Son类的对象的时候,会先找到Son类的父类——Father类,将Father的实例方法放在方法表中,就会有以下方发表结构:

(注:其实最先创建的是Object类的方法表,因为Object是所有类的父类,此处略过不讲)

接下来就会在将Son类的方法放入方发表中,此时要注意new和override。new其实相当于给方法重命名,虽然方法名和父类一样,但是是属于子类的另外一个方法了。override会重写父类方法,可以简单的理解为重写方法体。这是方发表就会变为:

所以,Father son = new Son();   最终的方发表会变成这样。

1             Father son = new Son();
2 son.DoWork();
3 son.DoVirtualWork();
4 son.DoVirtualAll();

执行以上代码时,会从方发表中自上而下查找,所以才会出现这种结果:

好了,继续跟着程序往下走,看看new Grandson()时,方发表又发生了哪些改变。

Grandson集成了Son类,在执行new Grandson()时,会先把Father的方法写入方发表,然后再是Son,这两个的方发表上文都画出了。最后在创建Grandson类的方发表。

Grandson类有两个实例方法,都重写了父类的虚方法。但是这两个方法有区别:DoVirtualWork()在Son类中已经被new,所以这里Grandson重写的DoVirtualWork()是Son类new之后的DoVirtualWork(),和Father类的DoVirtualWork()已经没有关系。而对DoVirtualAll()的重写将会修改Father类的DoVirtualAll()方法。

此时方发表将会是这样:

执行方法:

1 Father aGrandson = new Grandson();
2 aGrandson.DoWork();
3 aGrandson.DoVirtualWork();
4 aGrandson.DoVirtualAll();

执行时,从方发表自上而下获取方法,执行,才会出现以下结果:

总结:

其实我对方发表的理解,也就是《你必须知道的.net》一书中讲到的那一段话,最初看那一段话的时候感觉迷迷糊糊,但是结合着这个例子再来理解,就好多了。

如果本文有错误,后者表述不当,还请多多赐教、留言!

C#继承关系中【方发表】的创建和调用的更多相关文章

  1. 解惑《你必须知道的.net》——C#继承关系中【方发表】的创建和调用

    前言: 现在正在读<你必须知道的.net>(第二版)一书,看到IL语言那一章,将call.callvirt和calli时候,书中举了一个例子,是一个三层继承的例子,我一开始看的时候就有点懵 ...

  2. JavaSE复习日记 : 继承关系和super关键字以及继承关系中方法的覆写

    /* * 类的继承和super关键字 * * 软件开发的三大目的: * 可拓展性; * 可维护性; * 可重用性; * * 这里单说下可重用性这一项: * 为了代码复用,复用方式有: * 函数的调用复 ...

  3. Java类继承关系中的初始化顺序

    Java类初始化的顺序经常让人犯迷糊,现在本文尝试着从JVM的角度,对Java非继承和继承关系中类的初始化顺序进行试验,尝试给出JVM角度的解释. 非继承关系中的初始化顺序 对于非继承关系,主类Ini ...

  4. java继承关系中成员变量,构造方法,成员方法的关系

    Java继承中的成员关系 A:成员变量 a:子类的成员变量名称和父类中的成员变量名称不一样,这个太简单写那个名字就访问那个名字! b:子类的成员变量名称和父类中的成员变量名称一样,这个怎么访问呢? 子 ...

  5. 继承关系中子类使用@Data注解问题

    HashSet中使用@Data注解问题 平时习惯使用lombok工具,免去了我们写get.set方法之类的,当然了,我们使用@Data注解后,equals().hashCode().toString( ...

  6. 1.7Oob 继承关系中构造方法的使用

    1:父类中最好要有一个空参数的构造方法,因为默认的构造方法在自定义了构造方法后就不存在了,需要显示的写出来. 若父类中没有空参数的构造方法,则子类必须有自定义的构造方法,且用super()调用父类的构 ...

  7. Java 中的多态,一次讲个够之继承关系中的多态

    多态是继封装.继承之后,面向对象的第三大特性. 现实事物经常会体现出多种形态,如学生,学生是人的一种,则一个具体的同学张三既是学生也是人,即出现两种形态. Java作为面向对象的语言,同样可以描述一个 ...

  8. 浅谈JAVA继承关系中的构造函数

    话不多说直接上例子,我的例子中定义了两个类,TheSon和TheFather,TheSon继承了TheFather,如图: TheSon类的定义: ​ TheFather类的定义: 当我们初始化The ...

  9. c++继承关系中成员函数的重载、重写、重定义之间的区别

    1.Override.Overload.Redefine Overload 重载只能发生在类内部,不能发生在子类和父类的继承中.具体来说,如果子类中有父类同名.同返回值类型,但是不同参数列表,这两个在 ...

随机推荐

  1. 【剑指offer】最大和连续子阵列

    个開始,到第3个为止).你会不会被他忽悠住? 输入: 输入有多组数据,每组測试数据包括两行. 第一行为一个整数n(0<=n<=100000),当n=0时,输入结束.接下去的一行包括n个整数 ...

  2. 开源 自由 java CMS - FreeCMS2.0 签字

    项目地址:http://www.freeteam.cn/ 会员注冊 打开浏览器,输入http://localhost:8080/register.jsp. 输入注冊信息后点击"注冊" ...

  3. 关于JavaScript中的事件代理

    今天面试某家公司Web前端开发岗位,前面的问题回答的都还算凑活,并且又问了一下昨天面试时做的一道数组去重问题的解题思路(关于数组去重问题,可以观赏我前几天写的:http://www.cnblogs.c ...

  4. 使用Blend的一些问题

    原文:使用Blend的一些问题 WPF开发,界面处理首选Blend,如果你开发了两年WPF都没接触过blend(当然这种几率不高),或者你刚接触WPF,可以考虑使用Blend,这货也算得上一个神器,上 ...

  5. cmd介面,进adb命令提示符error

    有几个操作的电话系统测试,需要输入adb命令时出现了头疼的事,当输入命令,一个直接报执行:error 推荐处理的方法: 1.当然就是关机重新启动.之前我是这样,挺麻烦.必进在win7上输入命令费时间. ...

  6. Swift中文教程(五)--对象和类

    原文:Swift中文教程(五)--对象和类 Class 类 在Swift中可以用class关键字后跟类名创建一个类.在类里,一个属性的声明写法同一个常量或变量的声明写法一样,除非这个属性是在类的上下文 ...

  7. C# Parse和Convert的区别分析(转)

    大家都知道在进行类型转换的时候有连个方法供我们使用就是Convert.to和*.Parse,但是疑问就是什么时候用C 什么时候用P 通俗的解释大家都知道: Convert 用来转换继承自object类 ...

  8. [ 单例、代理 & 通知 ]

    PS:手写单例.代理方法实现 & 通知的简单使用! [ 单例模式,代理设计模式,观察者模式! ] 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设 ...

  9. php正则函数学习

    原文:php正则函数学习 <?php /** * php正则函数学习 * * 原来的ereg 和eregi 函数已经废弃掉了,目前版本用preg_match代替 * * preg_match 在 ...

  10. 使用PHP生成PDF文档

    原文:使用PHP生成PDF文档 实际工作中,我们要使用PHP动态的创建PDF文档,目前有许多开源的PHP创建PDF的类库,今天我给大家来介绍一款优秀的PDF库,它就是TCPDF,TCPDF是一个用于快 ...