我们来分析一下(2)中的程序:
class tvprogram
public starttime
public internal_programdate
public property get programdate
programdate = day(internal_programdate) & _
" " & monthname(month(internal_programdate)) & _
" " & year(internal_programdate)
end property
public programtitle
end class
dim objtvshow
set objtvshow = new tvprogram
objtvshow.starttime = cdate("17:30")
objtvshow.internal_programdate = dateserial(1999,9,17)
objtvshow.programtitle = "the jerry springer show"
response.write objtvshow.programtitle & " is on at " & _
objtvshow.starttime & " on " & objtvshow.programdate & "."
当调用对象的属性programdate时,实际上执行了函数programdate,即如上定义的函数,而很快你也将习惯这种在声明部分使用public或private关键字的方式。关键字“property”,告知了编译器如同调用属性一样在外部调用函数。接着的“get”,表明该函数是输出还是获得一个值。
get的意思是“允许外部代码去‘获取’一个值”,与其类似的关键字还有“let”和“set”,但这两个比较复杂,因而我们以后再讨论。
接下去的代码看来有点难度的,给objectname.internal_programdate赋值并通过objectname.programdate来调用它。如果可以使用相同关键字同时为其赋值并获得它的值不是更好吗?当然,那也可以。
如果定义get和let属性的名称相同,可以将它们当作对象相同的属性,但这只限于它们定义了相同数量的成员。(以下代码看来不太相同,仅作为实例参考)
class tvprogram
public starttime
public internal_programdate
public property get programdate
programdate = day(internal_programdate) & " " _
& monthname(month(internal_programdate)) & _
" " & year(internal_programdate)
end property
public property let programdate(byval vardatein)
internal_programdate = cdate(vardatein)
end property
public programtitle
end class
dim objtvshow
set objtvshow = new tvprogram
objtvshow.starttime = cdate("17:30")
objtvshow.programdate = "17 sept 99"
objtvshow.programtitle = "the jerry springer show"
response.write objtvshow.programtitle & " is on at " & _
objtvshow.starttime & " on " & objtvshow.programdate & "."
以上代码中let的声明部分看来似乎是一个多余的元素,当我第一次看到时研究了很长时间。每次我使用“0”作为变量用在每个属性上,我总是得到这个错误信息,“元素数量必须相等”。“它们确实相等!”抓狂之后,我回过头去看程序才觉得自己的愚蠢!:)
原因是,当你试图为programdate赋值时,你会使用这样一行程序:
objtvshow.programdate = dtmmydate
为了方便,等号右边的值(这里指dtmmydate)作为了一个程元赋给了函数。因此编译器可能会认为在get programdate行有0程元,而let programdate却多一个!分配的值总是被略过而作为属性的最后一个程元,所以即使你使用其他程元,所赋的值总是作为最后一个程元。
现在看程序。无论通过programdate设置日期为文本形式,还是用internal_programdate译成日期变量,程序都没有问题。但能不能只使用一个入口呢?
如果internal_programdate只能在内部有效,而使用let programdate检查传输的数据类型,我们就可以作出选择。例如:
class tvprogram
public starttime
private internal_programdate
public property get programdate
programdate = day(internal_programdate) & " " & _
monthname(month(internal_programdate)) & _
" " & year(internal_programdate)
end property
public property let programdate(byval vardatein)
if isdate(vardatein) then
internal_programdate = vardatein
else
'place some error handling code in here.
end if
end property
public programtitle
end class
并同样声明starttime属性:
class tvprogram
private internal_starttime
public property get starttime
starttime = hour(internal_starttime) & ":" _
& minute(internal_starttime)
end property
public property let starttime(byval vartimein)
if isdate(vartimein) then
internal_starttime = vartimein
end if
end property
private internal_programdate
public property get programdate
programdate = day(internal_programdate) & " " _
& monthname(month(internal_programdate)) & _
" " & year(internal_programdate)
end property
public property let programdate(byval vardatein)
if isdate(vardatein) then
internal_programdate = vardatein
end if
end property
public programtitle
end class
...
现在的代码离我们想要的还是有些不太实用,我们将在其他页使用类tvprogram,因此最好将其独立定义,以便所有也面都可以调用。我们将在第四部分讨论这点。
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器