分享

在VBScript中使用类(三)

 Ansion 2006-04-16

我们来分析一下(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,因此最好将其独立定义,以便所有也面都可以调用。我们将在第四部分讨论这点。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多