ASP面向对象编程探讨及比较

ASP是Microsoft于较早期推出的动态网页编程技术,但其结合ADO对数据库方便快捷的访问、结合XML、COM/ActiveX等其它技术 实现服务器多层结构的功能使它在今天还有着顽强的生命力,并且依然有着一定的发展。ASP.Net虽然在架构上完全不同于ASP,但它很多内建对象也是基 于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")来创建一个对象,然后即可实现上面预想的功能了。

转载于:https://www.cnblogs.com/wonderow/archive/2004/11/18/65139.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/497381.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【重点!!!】【单调栈】84.柱状图中最大矩形

题目 法1&#xff1a;单调栈[原版] O(N)O(N) 必须掌握算法&#xff01;&#xff01;&#xff01; class Solution {public int largestRectangleArea(int[] heights) {int n heights.length, res 0;int[] leftMin new int[n], rightMin new int[n];Stack<Integer>…

android support library github,Android Support Library 之 夜间模式

原标题&#xff1a;Android Support Library 之 夜间模式前言夜间模式实现方式&#xff1a;1、通过切换theme来实现夜间模式。优点&#xff1a;可以匹配多套主题&#xff0c;并不局限于黑白模式缺点&#xff1a;需要大量定义主题详见博客&#xff1a;http://wuxiaolong.me/2015…

Replace Temp with Query(以查询取代临时变量)

一个临时变量保存某一个表达式的运算结果 double basePrice quantity * itemPrice; if (basePrice > 1000) {return basePrice * 0.95; } else {return basePrice * 0.98; } 重构后 if (basePrice() > 1000) {return basePrice() * 0.95; } else {return basePrice()…

类脑信息处理研究取得进展

来源&#xff1a;AAAI2018概要&#xff1a;近期&#xff0c;中国科学院自动化研究所类脑智能研究中心类脑信息处理&#xff08;BRAVE&#xff09;研究组&#xff0c;在研究员张兆翔的带领下&#xff0c;在借鉴生物神经结构、认知机制与学习特性的神经网络建模与类人学习研究中取…

今天下午爽了一把!

呵呵&#xff0c;很久没这么爽爽地看电影了&#xff0c;一个下午居然连续看了三部电影&#xff01;看到人不想看为止&#xff0c;实在是很过瘾的一个下午啊&#xff01;只是是翘课看的电影&#xff0c;感觉有点不太好&#xff0c;最近真是越来越堕落了。看来要好好克制一下自己…

展望:共融机器人的基础理论与关键技术

来源&#xff1a;《国家科学评论》概要&#xff1a;自1959年工业机器人诞生以来&#xff0c;机器人在机械制造、国防安全、健康服务、科考与医疗等方面发挥出越来越重要的作用。自1959年工业机器人诞生以来&#xff0c;机器人在机械制造、国防安全、健康服务、科考与医疗等方面…

Introduce Explaining Variable(引入解释性变量)

难于理解的复杂表达式 if ((platform.toUpperCase().indexOf("MAC") > -1) &&(brower.toUpperCase().indexOf("IE") > -1) &&wasInitialized && resize > 0) {// do something } 重构后 final boolean isMacOS platf…

android sdk 目录说明,Android的sdk、api及工程目录说明

SDK下包的说明1&#xff1a;add-ons&#xff1a;Android开发需要的第三方文件和软件库2&#xff1a;docs&#xff1a;Android的文档。包括开发指南、API参考、资源等3&#xff1a;extras&#xff1a;扩展的附加包4&#xff1a;platforms&#xff1a;你安装下载的所有Android平台…

角色的改变

今年因为个人的原因&#xff0c;换了一个环境&#xff0c;一直都是做开发的&#xff0c;新的工作也是开发&#xff0c;开发部经理&#xff0c;怎么说还是开发。 可是时间越长越觉得操心的不仅是开发的问题了&#xff0c;负责我们公司的经理去美国读书去了&#xff0c;基本不管了…

哈萨比斯导师:人工智能媲美人类或需两百年,神经学是条出路

来源&#xff1a;澎湃新闻概要&#xff1a;从围棋到智能驾驶&#xff0c;深度学习缔造了眼下这一波人工智能热潮。在深度学习最热的两大关键词“AlphaGo”和“自动驾驶”&#xff0c;托马索波吉奥&#xff08;Tomaso Poggio&#xff09;都有声名卓著的学生&#xff0c;分别是De…

我的第一个blog

我的第一个blog 本来是为了 elvish ray 的开源注册的&#xff0c; 后来又在 sourceforge 注册了一个&#xff0c; 感觉那里的服务更专业&#xff0c; 这里还是说说闲话用吧……呵呵…… 当然还是会提供一些源码……posted on 2005-02-01 22:29 Len3d 阅读(...) 评论(...) 编辑 …

android sqlite 查询时间,android – sqlite日期查询

我是新的sqlite.我有一个有3列的表1. Id2. FoodName3. Date and time(ex: 1 Chicken 2012-08-10 13:54)我读到某处Android sqlite不提供日期数据类型.所以我使用文本数据类型在本地数据库中存储日期.它工作正常.现在我想写一个查询来检索两个日期之间的记录.我试过但我没有得到…

Split Temporary Variable(分解临时变量)

某个变量被赋值超过一次&#xff0c;它既不是循环变量&#xff0c;也不被用于汇总结果 double temp 2 * (height width); System.out.println(temp); temp height * width; System.out.println(temp); 重构后 final double perimeter 2 * (height width); System.out.p…

独家对话英伟达首席科学家:解码AI芯片战局

来源&#xff1a;智东西概要&#xff1a;独家对话Bill Dally博士&#xff0c;深度解读四大AI热点话题。从2017年1月底以来&#xff0c;英伟达的股价又从108美元一路飙升至240多美元&#xff0c;翻了一倍有多。而英伟达股价一飞冲天的背后&#xff0c;正是人工智能技术不断兴盛崛…

[翻译]2005年软件业界推出新产品非官方计划

虽然预测未来的最好方法就是发明(The best way to predict the future is to invent it. -- A. Kay)&#xff0c;但是对于我等现在还没开始发明或者还没有能力发明的人来说&#xff0c;不妨还是看看2005年会软件业界会推出点什么软件&#xff0c;想象一下程序员的生活会不会在2…

android 百度地图3.0定位,Android 百度地圖 SDK v3.0.0 (二) 定位與結合方向傳感器...

新功能添加&#xff1a;第一&#xff0c;定位功能&#xff1b;第二&#xff0c;與方向傳感器結合&#xff0c;通過旋轉手機進行道路的方向確認。1、初次啟動定位/*** 定位的客戶端*/privateLocationClient mLocationClient;/*** 定位的監聽器*/publicMyLocationListener mMyLoc…

Remove Assignments to Parameters(移除对参数的赋值)

对入参进行赋值 int discount(int inputVal, int quantity, int yearToDate) {if (inputVal > 50) {inputVal - 2;} } 重构&#xff1a;用一个临时变量取代该参数 int discount(int inputVal, int quantity, int yearToDate) {int result inputVal;if (inputVal > 50…

房地产信息

今天随便在网上看了一下长沙的房产&#xff0c;觉得有几个小区&#xff0c;还比较适合。 枫林绿洲 http://house.csonline.com.cn/lp/displp.asp?id39 西子园 http://house.csonline.com.cn/lp/displp.asp?id42 转载于:https://www.cnblogs.com/jacklaw/archive/2005/02/17/…

Replace Method with Method Object(以函数对象取代函数)

在一个大型函数中&#xff0c;由于局部变量的使用导致无法采用Extract Method class Order...double price() {double primaryBasePrice;double secondaryBasePrice;double teriaryBasePrice;// long computation.....} } 重构&#xff1a;将这个函数放进一个单独对象中&…

强烈推荐 MicroSoft Office OneNote

微软推出了一款电子记事本软件&#xff0c;MicroSoft Office OneNote &#xff0c;强烈推荐之&#xff01; 平时工作中&#xff0c;一般大家都会记笔记&#xff0c;好记性不如烂笔头嘛&#xff0c;但是大家都还不愿意拿笔记录在纸上&#xff0c;特别是一些比较重要的资料&…