假设我有一个对象。。。
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_A
和locker_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