我可以用随机变量实例化一个对象或类吗?

时间:2015-11-28 07:03:13

标签: object vbscript

让我们说我有一个对象......

Class test
    Public a
    Public b
End class

在我的代码中,我想在不知道预定变量名的情况下实例化它来存储新实例。

这可能吗?然后,我如何调暗随机变量?

我希望能够这样做,因为我不希望将我的用户输入存储或保存在同一变量中,而其他数据冲突。比如说,例如我正在为运动员存储统计数据,我问运动员的名字。如果每次用户输入不同的名称,我都不希望在同一对象实例中包含此信息。我可以为运动员创建一个对象并在另一个对象中引用该对象吗?

我有一段代码:

Function addStats
    dim pAtt, pComp, pInt, pTds, pYds, endNum, pName
    Wscript.StdOut.WriteLine "What is your quarterback's name"
    pName = Wscript.StdIn.ReadLine

    Wscript.StdOut.WriteLine "How many attempts: "
    pAtt = Wscript.StdIn.ReadLine
    'chkNum(pAtt)
    Wscript.StdOut.WriteLine "How many completions: "
    pComp = Wscript.StdIn.ReadLine
    'chkNum(pComp)
    Wscript.StdOut.WriteLine "How many yards: "
    pYds = Wscript.StdIn.ReadLine
    'chkNum = pYds
    Wscript.StdOut.WriteLine "How many touchdowns: "
    pTds = Wscript.StdIn.ReadLine
    'chkNum = pTds
    Wscript.StdOut.WriteLine "How many interceptions: "
    pInt = Wscript.StdIn.ReadLine
    'chkNum = pInt
    endNum = UBound(newStats) + 1
    redim preserve newStats(endNum)

    '---- vvvv ----
    set newStats(endNum) = new QB
    '---- ^^^^ ----

    newStats(endNum).att = pAtt
    newStats(endNum).comp = pComp
    newStats(endNum).yds = pYds
    newStats(endNum).tds = pTds
    newStats(endNum).ints = pInt
    newStats(endNum).qbname = pName
    Wscript.StdOut.WriteLine "Stats Added"
    writeBuffer()
end Function

对象是:

class QB
    dim att, comp, yds, tds, ints, qbname

    public property let qbAtt(n)
        att = n
    end property
    public property let qbComp(n)
        comp = n
    end property
    public property let qbYds(n)
        yds = n
    end property
    public property let qbTds(n)
        tds = n
    end property 
    public property let qbInt(n)
        ints = n
    end property
    public property let qName(n)
        qbname = n
    end property

    public property get qbAtt
        qbAtt = att
    end property
    public property get qbComp 
        qbComp = comp
    end property
    public property get qbYds
        qbYds = yds
    end property
    public property get qbTds
        qbTds = tds
    end property
    public property get qbInt
        qbInt = ints
    end property
    public property get qName   
        qName = qbname
    end property
end class

突出显示的语句是我使用全局变量newStat()实例化对象。我的信念是,我必须为四分卫创建一个类,并以某种方式将其引用到一个由四分卫的名字确定的变量数组中,或者创建一个函数,该函数接受用户提示变量,询问四分卫&# 39; s name并将其设置为实例化QB类的数组。

1 个答案:

答案 0 :(得分:1)

我认为你混淆了类,对象和变量。类基本上是描述特定类别的属性和行为实体的模板。对象是类的实例。变量是引用对象(或基本类型的数据)的标识符。

以储物柜为例。储物柜通常有颜色,可以打开和关闭,它们可能包含许多物品。因此,储物柜(一类"储物柜")的一般描述可能如下所示:

Class Locker
  Public color
  Public closed
  Public content

  Sub Class_Initialize
    closed = True
    content = Array()
  End Sub

  Sub Open
    closed = False
  End Sub

  Sub Close
    closed = True
  End Sub
End Class

构造函数(Class_Initialize)是一种特殊方法,仅在创建对象(类的实例)时调用。它设置对象的初始状态。有点像在工厂里建一个储物柜。

特定的储物柜(物品)可能是绿色的,包含帽子和杂志,而另一个储物柜(物品)可能是蓝色的,包含一本书和一件夹克。

Set locker_A = New Locker
locker_A.color = "green"
locker_A.content = Array("hat", "magazine")

Set locker_B = New Locker
locker_B.color = "blue"
locker_B.content = Array("book", "jacket")

为了能够在程序中实际使用对象(或其他数据),您需要变量。这些标识符(上例中的locker_Alocker_B)允许您引用程序代码中的特定对象,以便访问其属性和方法。

运行声明时

Set newStats(2) = New QB

它创建了类QB的新实例(一个新对象),并在该数组newStats的第三个插槽中放置了对该对象的引用。之后,您可以使用newStats(2)在程序或脚本中引用该对象。例如:

newStats(2).yds = 42 'yards

如果您有多个QB对象并将它们存储在不同的阵列插槽中,那么它们之间不应存在任何冲突,只要您不替换它中的引用即可一个插槽与另一个插槽。

Set newStats(2) = newStats(5)  '<-- don't do this

如果您想通过特定属性(例如名称)而不是索引来访问列表中的对象,您可以使用Dictionary而不是数组:

Set newStats = CreateObject("Scripting.Dictionary")
newStats.CompareMode = vbTextCompare    'make lookups case-insensitive

...

Set player = New QB
player.att = pAtt
...
player.qbname = pName

newStats.Add pName, player

然后你可以像这样访问一个特定的玩家:

name = "Charley Johnson"
WScript.Echo newStats(name).yds