ASP面向对象编程探讨及比较
来源:CSDN 发布时间:2008-04-12 07:16:00
ASP结合ADO对数据库方便快捷的访问、结合XML、COM/ActiveX等其它技术 实现服务器多层结构的功能使它在今天还有着顽强的生命力。ASP.Net很多内建对象也是基 于ASP进行扩展的。网上有无数的介绍ASP的文章,却鲜有介绍ASP面向对象以及与其它语言比较的,这也就是我下决心写这篇文章的原因。
因为是早期的版本,ASP只提供了很弱的面向对象的接口。众所周知,ASP的实现语言分为VBScript和JavaScript/JScript: 在VBScript中有Class关键字,可以用来声明一个自定义类;JavaScript就比较怪,它用一个函数来“声明”类,然后在该函数里通过 this.prototype定义属性,this.func定义方法。这里将以VBScript为主进行讨论,VBScript的类声明是这样的:
Class name
statements
End Class
这里statements里可以声明公有或私有的成员,包括函数、成员和属性。关于属性,不得不赞一下微软的get和set方法,这个在COM中出现 的理念,直到.Net中一直被沿用下来,个人认为对程序员而言,比Java用getProp()、setProp()两个方法来实现同样效果要方便直观得多。
相比之下,VBScript中的类与PHP4中的类各有千秋(当然跟最新的PHP5没法比),VBScript中的类保持了VB的不完全面向对象的 “特性”,它仅仅实现了最基本的构造/析构函数、成员函数、变量、属性,甚至构造函数不能带参数。PHP4中则还实现了继承、函数重载等类的重要性质,也 只有实现了这些,才能称之为面向对象,才有可能为实现多态提供基础。但二者均没有实现类的静态(static)成员等功能。
尽管可以用其它一些变通达到同 样的功效,但从面向对象的思想出发,这都是不彻底的(由于PHP非常灵活,PHP4中可以通过成员函数的静态变量来间接实现类的静态变量;而“::”—— 可以实现类的静态函数访问的操作符——在PHP4中没有严格检查。换句话说,所有的成员函数都可以当成静态函数访问,只要你在该函数里不使用成员变量就不 会出错。VBScript根本没有实现static,只能用Session或Application来实现)。所以在平常的使用中,你可以使用 VBScript的自定义类来封装一些操作,但不要指望它像C++ / Java / .Net那样为你的面向对象思想服务。
VBScript同样发扬了VB中默认的参数或变量是引用的好风格。这样,尽管Script语言中对类型不敏感,但它还能够达到C/C++里指针/引用同样的功效,完成很多事情。最基本的,比如说用它定义一个列表(List)的节点类ListNode:
<%
Class ListNode
Public Content
Public NextNode
Private Sub Class_Initialize()
Content="Node"
Set NextNode=Nothing
End Sub
End Class
%>
呵呵,就这么简单,但不要感到鄙夷,也不要忘记对变量初始值。VB中也差不多,声明时加上类型就行了。而使用时:
<%
Set nh=new ListNode
Set nh.NextNode=new ListNode
'其它语句……
'遍历列表
Set n=nh
While Not n is Nothing
Response.Write n.Content+"<br />"
Set n=n.NextNode
Wend
%>
如果不加其它代码,上面的运行结果是两个“node”。VBScript的自定义类和对象也不外如是,只要你掌握基本的概念,对它有一定了解,就再简单不过了。再次强调,用Set语句来对对象进行赋值,相当于Java里的赋值,都是获得一个引用。这比PHP4里默认对象赋值是调用拷贝构造函数来创建一 个新的对象好多了(甚至连obj=new Obj;这样的语句都会创建两个对象!如果你想获得引用的话,要在等号后变量前显示地加上&),而似乎PHP5也不想修改PHP4的这种做法。
ASP中的Session本身是可以储存对象的,它可以保存基本变量,数组,自动化对象(Automation Object)等,但在储存自定义类的对象时会碰到问题。如下面的代码:
<%
If isempty(Session("node")) Then Set Session("node")=New ListNode
Set n=Session("node")
Response.Write n.Content
%>
还是上面的ListNode这个类,这段代码意图在一个用户会话中只保留一个ListNode的对象。所以在用户第一次访问该网页时,会生成ListNode的一个对象,并保存在Session(“node”)中;后面访问该网页时,因为Session(“node”)不为空了,所以不会生成一个新的对象,而是到 Session(“node”)中取出保存的对象。理论上应该也会输出100,但是问题来了,ASP一直会报错:
Microsoft VBScript runtime error '800a01b6'
Object doesn't support this property or method: 'n.Content'
用n.Type也会出错。同样的代码翻译成PHP,运行却是可以通过的。为什么?
个人分析下来,认为Session可以保存对象是没错,只是VBScript中类型转换的机制太弱,而且没有显式的强制类型转换供用户使用,无法将 Session(“node”)正确转换为ListNode类型。因为是自定义的类,我们只能在每个页面中都出现类的定义语句,这样在ASP看来,每次读 取这个页面时,ListNode类都是一个新类,所以就不认得Session中的这个类的对象了。
结论:尽量不要想到用Session或Application来存储ASP中自定义类的对象。如果确实需要,可以考虑用COM来编写类,然后在VBScript中用:Set Session("obj") = Server.CreateObject("YourApp.YourClass")来创建一个对象,然后即可实现上面预想的功能了。


猜你喜欢
- 本文实例讲述了Python selenium的基本使用方法。分享给大家供大家参考,具体如下:selenium是一个web自动化测试工具,se
- python3 判断空列表@(python3)有个判断列表是否为空的需求,试了好多方式,比如:a = []if a is not None:
- 为了更好的进行封装,每个实现不同功能的js代码应该有自己的js文件,这样如果一个网页中引用了多个js文件,如下 <script typ
- 记录一下如何用python爬取app数据,本文以爬取抖音视频app为例。编程工具:pycharmapp抓包工具:mitmproxyapp自动
- Golang 是一门非常适合编写网络爬虫的语言,它有着高效的并发处理能力和丰富的网络编程库。下面是一个简单的 Golang 网络爬虫示例:p
- if exists (select * from dbo.sysobjects where id = object_id(N'[db
- 在settings.py中将默认内容覆盖成DATABASES = {'default': {
- 前言PyEMD是经验模态分解 (EMD)及其变体的Python实现,EMD最流行的扩展之一是集成经验模态分解 (EEMD),它利用了噪声辅助
- 通过urllib2、re模块抓种子思路1.用程序登录论坛(如果需要登录才能访问的版块)2.访问指定版块3.遍历帖子(先取指定页,再遍历页面所
- 是不是很多人不用c#中的using和as操作符?甚至不知道? 其实这2个操作符在小处非常有用。 1、using&nb
- python中shape()函数shape函数是numpy.core.fromnumeric中的函数,它的功能是读取矩阵的长度。1、shap
- 在python中可以通过内置函数int()函数进行二进制转十进制;int()函数可以将一个指定进制的数字型字符串或者十进制数字转化为整型。P
- 经过倒腾12306的登录,还是实现了,请求头很重要...各位感兴趣的可以继续写下去.....import sysimport timeimp
- 本文实例讲述了python config文件的读写操作。分享给大家供大家参考,具体如下:1、设置配置文件[mysql]host = 1234
- 前言在我们的日常开发中, 常用的中间件有很多, 今天来讲一下怎么集成限流中间件, 它可以很好地用限制并发访问数来保护系统服务, 避免系统服务
- Python做了一个词云视频,以另一种角度来看小姐姐跳舞制作过程分为以下几个部分1、视频下载首先需要下载一个小姐姐跳舞的视频,这里我用的是
- 准备工作: ① 首先要会使用ThinkPHP这个框架 ② 最好有些ajax的基础(可以去看下小飞的另外一篇博文:Ajax实时验证"
- asp使用fso对象遍历目录及目录下的文件代码:<%@ Language=VBScript %><%&
- 刚开始学习Python的类写法的时候觉得很是麻烦,为什么定义时需要而调用时又不需要,为什么不能内部简化从而减少我们敲击键盘的次数?你看完这篇
- 测试驱动开发(TDD)是一个迭代的开发周期,强调编写实际代码之前编写自动化测试。这个过程很简单: 先编写