Michelle Chen [VBScript] 程式設計教學:建立類別 (Class) 和物件 (Object)

Facebook Twitter LinkedIn LINE Skype EverNote GMail Yahoo Email

微軟網站沒有強調以 VBScript 撰寫物件 (object) 的方式,VBScript 的確也缺乏完整的物件導向 (object-oriented) 特性,但我們仍然可以用 VBScript 撰寫基於物件的程式 (object-based programming)。

一般來說,shell 命令稿以純程序性來撰寫程式,幾乎不會去談物件導向方面的議題。我們在本文展示這項語言特性不代表一定要用這項特性寫程式,而是做為一種包裝程式碼的選項。

在本文中,我們建立平面坐標的 Point 類別,這個類別相當單純,只有 getters 和 setters,很適合用來練習如何撰寫物件。由於 VBScript 缺乏第三方函式庫的概念,我們把所有的程式碼都寫在一起,看起來會略長一些:

' Call main block.
Call Main

' Main program block.
Sub Main()
    ' Create a new Point object.
    Dim p : Set p = (New Point)(0, 0)

    ' Retrieve x and y.
    Assert p.x = 0, "It should be 0"
    Assert p.y = 0, "It should be 0"

    ' Mutate x and y.
    p.x = 3
    p.y = 4

    ' Retrieve x and y again.
    Assert p.x = 3, "It should be 3"
    Assert p.y = 4, "It should be 4"
End Sub

Class Point
    Private px
    Private py

    ' Defautlt constructor of Point.
    Public Default Function Init(x, y)
        px = x
        py = y

        Set Init = Me
    End Function

    ' Getter for x.
    Public Property Get x
        x = px
    End Property

    ' Setter for x.
    Public Property Let x(v)
        px = v
    End Property

    ' Getter for y.
    Public Property Get y
        y = py
    End Property

    ' Setter for y.
    Public Property Let y(v)
        py = v
    End Property
End Class

' Home-made assert for VBScript
sub Assert( boolExpr, strOnFail )
    if not boolExpr then
        Err.Raise vbObjectError + 99999, , strOnFail
    end if
end sub

在本例中,我們利用 Main 副程式模擬 C 家族語言中的主函式,這個不是強制的,只是讓程式碼看起來比較美觀。

建立物件和一般賦值的語法略有不同,我們節錄其語法如下:

' Create a new Point object.
Dim p : Set p = (New Point)(0, 0)

對變數賦值物件時,要額外加上 Set。由於我們這個物件是新的物件,要用 New 來建立新物件,並傳入參數。

讀者應該會發現我們這個物件在存取屬性時是用類似於存取變數的方式,而非函式呼叫,如下例:

' Mutate x and y.
p.x = 3
p.y = 4

這是因為我們使用 property 這項特性來撰寫類別的公開介面。我們以 x 為例:

' Getter for x.
Public Property Get x
    x = px
End Property

' Setter for x.
Public Property Let x(v)
    px = v
End Property

Property 在 C# 等物件導向語言也可以看到,算是一種讓公開介面更乾淨的語法糖。