让我们说我有一个对象......
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
类的数组。
答案 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_A
和locker_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