vbscript - una - que es un objeto en visual basic
Sobrecarga de constructores en VBScript (4)
Encontré una manera de extender clases en VBScript, pero ¿hay alguna forma de pasar parámetros o sobrecargar el constructor? Actualmente estoy usando una función Init para inicializar las propiedades, pero me gustaría poder hacer esto cuando creo el objeto.
Esta es mi clase de muestra:
Class Test
Private strText
Public Property Get Text
Text = strText
End Property
Public Property Let Text(strIn)
strText = strIn
End Property
Private Sub Class_Initialize()
Init
End Sub
Private Sub Class_Terminate()
End Sub
Private Function Init
strText = "Start Text"
End Function
End Class
Y lo creo
Set objTest = New Test
Pero me gustaría hacer algo como esto
Set objTest = New Test(strInitText)
¿Es esto posible o el objeto debe ser creado e inicializado en dos setps?
Puede solucionarlo haciendo que su función Init devuelva el objeto en sí ...
Class Test
Private m_s
Public Function Init(s)
m_s = s
Set Init = Me
End Function
Public Function Hello()
Hello = m_s
End Function
End Class
Dim o
Set o = (New Test).Init("hello world")
Echo o.Hello
Tienes que hacerlo en dos pasos. VB Script no admite la sobrecarga, por lo que no puede modificar el constructor predeterminado con nuevos parámetros. Lo mismo vale para Vb6
Un poco hackish, seguro, pero cuando necesito varargs en llamadas, uno de mis parámetros lo paso como una matriz, es decir,
Rem printf done poorly
sub printf(fmt, args)
dim fp, vap:
dim outs:
dim fini:
fini = 0:
vap = 0:
while (not fini)
fp = index(fmt,"%"):
if (not(isNull(fp))) then
'' do something with %f, %s
select case(fp)
case ''c'':
outs = outs & charparse(args(vap)):
case ''s'':
outs = outs & args(vap):
'' and so on. Quite incomplete but you get the idea.
end select
vap = vap + 1
end if
wend
end sub
printf("%s %d/n",array("Hello World", 42)):
Solo para alterar ligeramente el método de svinto ...
Class Test
Private m_s
Public Default Function Init(s)
m_s = s
Set Init = Me
End Function
Public Function Hello()
Hello = m_s
End Function
End Class
Dim o : Set o = (New Test)("hello world")
Es como lo hago Lamentablemente, no hay sobrecarga.
[edit] Aunque si realmente quisieras, podrías hacer algo como esto ...
Class Test
Private m_s
Private m_i
Public Default Function Init(parameters)
Select Case UBound(parameters)
Case 0
Set Init = InitOneParam(parameters(0))
Case 1
Set Init = InitTwoParam(parameters(0), parameters(1))
Else Case
Set Init = Me
End Select
End Function
Private Function InitOneParam(parameter1)
If TypeName(parameter1) = "String" Then
m_s = parameter1
Else
m_i = parameter1
End If
Set InitOneParam = Me
End Function
Private Function InitTwoParam(parameter1, parameter2)
m_s = parameter1
m_i = parameter2
Set InitTwoParam = Me
End Function
End Class
Lo que le da a los constructores ...
Test()
Test(string)
Test(integer)
Test(string, integer)
que puedes llamar como:
Dim o : Set o = (New Test)(Array())
Dim o : Set o = (New Test)(Array("Hello World"))
Dim o : Set o = (New Test)(Array(1024))
Dim o : Set o = (New Test)(Array("Hello World", 1024))
Un poco de dolor sin embargo.