欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2023-10-20 14:23:13
asp面向对象编程探讨及比较     选择自 rainman_net 的 blog ...
asp面向对象编程探讨及比较     选择自 rainman_net 的 blog  
关键字   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")来创建一个对象,然后即可实现上面预想的功能了。