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



假设我有一个对象。。。

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()实例化对象。我认为,我要么只为四分卫创建一个类,并以某种方式将其引用到根据四分卫名称确定的变量数组中,要么创建一个函数,该函数接受询问四分卫名称的用户提示变量,并将其设置为实例化QB类的数组。

我认为您混淆了类、对象和变量。类基本上是描述特定类别的属性和行为实体所具有的模板。对象是类的实例。变量是指对象(或基元类型的数据)的标识符。

以储物柜为例。储物柜通常有一种颜色,可以打开和关闭,而且里面可能有很多物品。因此,储物柜("储物柜"类)的一般描述可能如下所示:

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

它创建类CCD_ 6的新实例(新对象)并将对该对象的引用放置在数组CCD_。之后,您可以使用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

最新更新