zoukankan      html  css  js  c++  java
  • C#继承关系中【方发表】的创建和调用

    —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时候,书中举了一个例子,是一个三层继承的例子,我一开始看的时候就有点懵。

    代码如下:

     View Code

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

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

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

    创建方发表:

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

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

     View Code

    根据以上代码,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()时,方发表又发生了哪些改变。

     View Code

    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》一书中讲到的那一段话,最初看那一段话的时候感觉迷迷糊糊,但是结合着这个例子再来理解,就好多了。

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

  • 相关阅读:
    使用winScp、putty导出mysql
    npm安装依赖
    node_modules文件夹出现.staging文件夹是怎么回事?
    jhipster生成工程
    npm使用国内淘宝镜像
    JAVA实现指定日期加几天
    php 使用ldap_connect方法连接AD时失败原因分析
    oracle中数据发生变动一定要commit 一定要commit 一定要commit
    Math中的round
    java中的实例变量和类变量的区别与联系:
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3629613.html
Copyright © 2011-2022 走看看